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
相关产品推荐
相关产品推荐

