为啥使用 Oracle_cx 时显示“无效长度”错误消息?

Posted

技术标签:

【中文标题】为啥使用 Oracle_cx 时显示“无效长度”错误消息?【英文标题】:Why is 'invalid length' error message showing when using Oracle_cx?为什么使用 Oracle_cx 时显示“无效长度”错误消息? 【发布时间】:2019-07-23 15:25:36 【问题描述】:

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

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

我尝试将值更改为更低(“1”和“A”),但即使这样也是“无效长度”。

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)

上面的sn-p导致如下错误信息:

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 对象传递不会更改错误消息

【问题讨论】:

它对我“有效”(我得到一个 ORA-942 - 如果你提供一个完整的测试用例,提供版本和操作系统信息会很好)。您可以检查行尾和字符集问题。 【参考方案1】:

我找到了解决办法: 问题来自于在循环中调用的 .read()。结果,它会在第一次正确读取文件,但在随后的循环中,它只会读取 null/EOF。

要解决这个问题,我所要做的就是将 sql.read() 设置为一个变量before 循环,并使用该变量而不是在每个循环中调用 .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())

【讨论】:

以上是关于为啥使用 Oracle_cx 时显示“无效长度”错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Xcode 在 appdelegate.h 文件中使用 AVAudioPlayer Delegate 协议时显示警告?

为啥将其放入模板 yaml 文件时显示 Unexpected value 'pool' 错误?

#用户登陆(三次输错机会)且每次误时显示剩余错误次数(提示:使用字符串格式化)

为啥 MyEclipse 在编译时显示 join_table not found 错误

为啥 Instant 在彼此之后打印时显示不同的值? [关闭]

为啥 Vue 路由器/Webpack 开发服务器现在在页面刷新时显示无法获取/路径?