Python 为什么是';无效长度';使用Oracle\u cx时显示错误消息?

Python 为什么是';无效长度';使用Oracle\u cx时显示错误消息?,python,oracle,cx-oracle,bind-variables,Python,Oracle,Cx Oracle,Bind Variables,使用cx_Oracle,我尝试使用Python脚本执行sql命令,使用绑定变量“plat”和“tick”。当尝试执行此命令时,它给出错误“ORA-24373:为语句指定的长度无效” 为了调试,我通过Oracle(而不是Python)使用与脚本相同的参数(plat=1234567,tick='ABCDE')进行了SQL调用,并按预期运行。我尝试以dict和单个命名变量的形式传递参数,但两次都出现了相同的错误 我尝试将值更改为较低的值('1'和'A'),但即使如此,这也是一个“无效长度” updat

使用cx_Oracle,我尝试使用Python脚本执行sql命令,使用绑定变量“plat”和“tick”。当尝试执行此命令时,它给出错误“ORA-24373:为语句指定的长度无效”

为了调试,我通过Oracle(而不是Python)使用与脚本相同的参数(plat=1234567,tick='ABCDE')进行了SQL调用,并按预期运行。我尝试以dict和单个命名变量的形式传递参数,但两次都出现了相同的错误

我尝试将值更改为较低的值('1'和'A'),但即使如此,这也是一个“无效长度”

updateRecords.py

fetchRecentry.sql

上述代码段导致以下错误消息:

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
我检查过的其他事项:

-我的fetchComp.read()确实返回了所需的代码


-作为dict对象传入变量不会更改错误消息

我找到了一个解决方案: 问题来自于在循环内部调用.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())

它对我来说“有效”(我有一个ORA-942,如果你能提供一个完整的测试用例、版本和操作系统信息就好了)。您可以检查行尾和字符集问题。
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

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())