为什么在使用 Oracle_cx 时显示 'invalid length' 错误消息?
Why is 'invalid length' error message showing when using Oracle_cx?
使用 cx_Oracle,我尝试使用 Python 脚本执行 sql 命令,使用绑定变量 'plat' 和 'tick'。尝试执行此命令时,出现错误 "ORA-24373: invalid length specified for statement".
为了调试,我使用与我的脚本相同的参数(plat=1234567,tick='ABCDE')通过 Oracle(不是 Python)调用了一个 SQL,它运行 符合预期。我尝试将参数作为 dict 和单个命名变量传递,但两次我都遇到了相同的错误。
我尝试将值更改为较低的值(“1”和 'A'),但即便如此也是 'invalid length'。
updateRecords.py
import os
import cx_Oracle
# For security reasons I cannot show my 'create_connection()' function,
# but suffice to say I have tested it and it works as desired.
...
#Setup:
WORKING_PATH = os.path.dirname(os.path.abspath(__file__))
SQL_PATH = os.path.join(WORKING_PATH, 'sql')
cnnSB = create_connection()
cnnSB_cursor = cnnSB.cursor()
...
fetchComp = open(os.path.join(SQL_PATH, 'fetchRecentEntry.sql'), 'r')
for x in range(0, 5):
cnnSB_cursor.execute(fetchComp.read(), {"plat":'A', "tick":1}) # ERROR LINE
fetchRecentEntry.sql
select *
from MFS_PCIINCEXTFUNDBYPLAT
where PLATFORM = :plat
and TICKER = :tick
and STARTDATE = (select max(STARTDATE) from MFS_PCIINCEXTFUNDBYPLAT
where PLATFORM = :plat
and TICKER = :tick)
以上代码段导致以下错误消息:
File "updateRecords.py", line 297, in main
cnnSB_cursor.execute(fetchComp.read(), plat='A', tick=1)
cx_Oracle.DatabaseError: ORA-24373: invalid length specified for statement
我检查过的其他内容:
-My fetchComp.read() return 需要的代码
-将变量作为字典对象传递不会更改错误消息
我找到了解决办法:
问题来自 .read() 在循环 内部被调用 。结果,它第一次会正确读取文件,但在随后的循环中它只会读取 null/EOF.
要修复,我所要做的就是在 循环之前将 sql.read() 设置为变量 ,并使用该变量而不是调用 .read( ) 每个循环。
示例:
sql = fetchComp.read()
for index, testRow in testDF.iterrows():
cnnSB_cursor.execute(sql, tick=testRow[1], plat=testRow[0])
compDF = pd.DataFrame(cnnSB_cursor.fetchall())
使用 cx_Oracle,我尝试使用 Python 脚本执行 sql 命令,使用绑定变量 'plat' 和 'tick'。尝试执行此命令时,出现错误 "ORA-24373: invalid length specified for statement".
为了调试,我使用与我的脚本相同的参数(plat=1234567,tick='ABCDE')通过 Oracle(不是 Python)调用了一个 SQL,它运行 符合预期。我尝试将参数作为 dict 和单个命名变量传递,但两次我都遇到了相同的错误。
我尝试将值更改为较低的值(“1”和 'A'),但即便如此也是 'invalid length'。
updateRecords.py
import os
import cx_Oracle
# For security reasons I cannot show my 'create_connection()' function,
# but suffice to say I have tested it and it works as desired.
...
#Setup:
WORKING_PATH = os.path.dirname(os.path.abspath(__file__))
SQL_PATH = os.path.join(WORKING_PATH, 'sql')
cnnSB = create_connection()
cnnSB_cursor = cnnSB.cursor()
...
fetchComp = open(os.path.join(SQL_PATH, 'fetchRecentEntry.sql'), 'r')
for x in range(0, 5):
cnnSB_cursor.execute(fetchComp.read(), {"plat":'A', "tick":1}) # ERROR LINE
fetchRecentEntry.sql
select *
from MFS_PCIINCEXTFUNDBYPLAT
where PLATFORM = :plat
and TICKER = :tick
and STARTDATE = (select max(STARTDATE) from MFS_PCIINCEXTFUNDBYPLAT
where PLATFORM = :plat
and TICKER = :tick)
以上代码段导致以下错误消息:
File "updateRecords.py", line 297, in main
cnnSB_cursor.execute(fetchComp.read(), plat='A', tick=1)
cx_Oracle.DatabaseError: ORA-24373: invalid length specified for statement
我检查过的其他内容:
-My fetchComp.read() return 需要的代码
-将变量作为字典对象传递不会更改错误消息
我找到了解决办法: 问题来自 .read() 在循环 内部被调用 。结果,它第一次会正确读取文件,但在随后的循环中它只会读取 null/EOF.
要修复,我所要做的就是在 循环之前将 sql.read() 设置为变量 ,并使用该变量而不是调用 .read( ) 每个循环。
示例:
sql = fetchComp.read()
for index, testRow in testDF.iterrows():
cnnSB_cursor.execute(sql, tick=testRow[1], plat=testRow[0])
compDF = pd.DataFrame(cnnSB_cursor.fetchall())