cx_Oracle.DatabaseError:ORA-00922:尝试使用python执行pl/sql时缺少选项或选项无效

gwbalxhn  于 2023-06-22  发布在  Oracle
关注(0)|答案(2)|浏览(219)

我正在尝试执行PL/SQL脚本,该脚本在运行时构造,但得到

cx_Oracle.DatabaseError: ORA-00922: missing or invalid option

看起来像一些格式问题的脚本,因为它是显示为字符串,但仍然不知道如何解决它。
下面是我正在尝试的代码:

script = '''Set serveroutput on;
    DECLARE
    V_req pls_integer;
    BEGIN
    V_req := infomediary_nse.request(
            p_inApp_id  => 100,
            p_inPayload => XMLTYPE(
       '<tag>hello</tag>'
      )
      );
      END;
      /'''

dbconnection = cx_Oracle.connect(ConnectionString)
str, err = dbconnection.cursor().execute(script)
iqxoj9l9

iqxoj9l91#

set serveroutput on

不是PL/SQL命令,而是SQLPlus命令,因此只能在SQLPlus中使用。
甚至最后的/也应该删除,因为它也是SQL*Plus特定的。
这应该可以工作:

script = '''DECLARE
    V_req pls_integer;
    BEGIN
    V_req := infomediary_nse.request(
            p_inApp_id  => 100,
            p_inPayload => XMLTYPE(
       '<tag>hello</tag>'
      )
      );
      END;'''

如果您使用set serveroutput onDBMS_OUTPUT调用中获取结果,则可以查看this
例如:

import cx_Oracle
conn = cx_Oracle.connect(..., ..., ...)
c = conn.cursor()

vSql = '''begin
           dbms_output.put_line('Hello!');
          end;
'''
c.callproc("dbms_output.enable")
c.execute(vSql)

statusVar = c.var(cx_Oracle.NUMBER)
lineVar = c.var(cx_Oracle.STRING)

while True:
  c.callproc("dbms_output.get_line", (lineVar, statusVar))
  if statusVar.getvalue() != 0:
    break
  print (lineVar.getvalue())

conn.close()

给出:

E:\Python>python testOracle.py
Hello!
bejyjqdl

bejyjqdl2#

我在从python执行存储过程时也遇到了同样的错误,通过在最后删除/,在python中修复了这个问题。
错误消息cx_Oracle.DatabaseError: ORA-00922: missing or invalid option表示Oracle数据库无法理解您尝试执行的PL/SQL语句。这种情况可能有多种原因,包括:

  • PL/SQL语句语法不正确。
  • PL/SQL语句正在使用的Oracle数据库版本不支持的功能。
  • PL/SQL语句试图访问不存在的表或其他对象。

要修复此错误,您需要检查PL/SQL语句是否存在任何语法错误。您还需要确保PL/SQL语句使用的是您正在使用的Oracle数据库版本所支持的功能。最后,您需要确保PL/SQL语句正在尝试访问确实存在的表或其他对象。
以下是解决此错误的一些提示:

  • 使用PL/SQL编辑器检查PL/SQL语句的语法。
  • 查找PL/SQL语句中的错误,例如缺少分号或拼写错误的关键字。
  • 确保PL/SQL语句使用的功能受您正在使用的Oracle数据库版本支持。
  • 有关每个Oracle数据库版本支持的功能的信息,请查看Oracle文档。
  • 确保PL/SQL语句正在尝试访问确实存在的表或其他对象。
  • 检查Oracle数据库以确保表或其他对象存在。

相关问题