You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用返回Oracle PL/SQL语句的函数执行时触发ORA-00900错误

Python调用返回Oracle PL/SQL语句的函数执行时触发ORA-00900错误

看起来你遇到的问题是PL/SQL块的语法不规范导致的ORA-00900错误,咱们一步步来排查修复:

首先,你的PL/SQL代码里有好几处语法缺失,Oracle对PL/SQL的语法要求非常严格,每个语句必须以分号结尾,你原来的代码里多个地方漏掉了:

  • 游标定义的结尾FROM DGB_Fct_Unfcd_Ocp_Hst a后面没加;
  • End Loop、Commit、最后End的后面都没加;
  • 循环里的UPDATE语句结尾也少了;

其次,你函数里用的{currentDate}变量没有明确的来源——这个变量在queryUpdate0函数内部是未定义的,得把它作为参数传递给函数,不然会导致生成的SQL里出现无效的字符串,也可能触发异常。

另外,其实你这个需求完全可以不用游标循环来实现,直接用单条UPDATE语句就能完成,效率还更高,避免了逐行更新的开销。

下面给你两种修复方案:

方案1:修复PL/SQL块的语法(保留游标循环)

# 把currentDate作为参数传入函数,避免变量作用域问题
def queryUpdate0(currentDate):
    return f"""declare
    cursor conver_0 is
        SELECT a.rowid row_id,
               a.PERIODO,a.MSISDN,a.PROCESO,a.PROCESO_2
        FROM DGB_Fct_Unfcd_Ocp_Hst a
        WHERE a.PERIODO = '{currentDate}';  -- 提前过滤日期,减少循环处理的数据量
Begin
    For c in conver_0 Loop
        Update DGB_Fct_Unfcd_Ocp_Hst
        set PROCESO = null,
            PROCESO_2 = null
        Where rowid = c.row_id
        and PERIODO = '{currentDate}';
    End Loop;
    Commit;
End;"""

执行的时候记得传入currentDate参数:

# 假设currentDate已经在当前脚本中定义,比如格式为'202405'
query6 = queries.queryUpdate0(currentDate)
cursor.execute(query6)

方案2:简化为单条UPDATE语句(更高效)

其实你不需要游标循环,直接用UPDATE语句就能批量更新,代码更简洁,执行效率也更高:

def queryUpdate0(currentDate):
    return f"""
    UPDATE DGB_Fct_Unfcd_Ocp_Hst
    SET PROCESO = null, PROCESO_2 = null
    WHERE PERIODO = '{currentDate}';
    COMMIT;
    """

执行方式和之前一样,传入currentDate参数即可。

最后补充一句:ORA-00900错误本质是Oracle无法解析你的SQL/PLSQL语句,所以优先排查语法问题,尤其是分号、关键字拼写这些细节,Oracle对这些要求很严。

备注:内容来源于stack exchange,提问作者Miguel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:53:10