cx_Oracle.DatabaseError: ORA-00922: missing or invalid option when trying to execute pl/sql using python

cx_Oracle.DatabaseError: ORA-00922: missing or invalid option when trying to execute pl/sql using python

AM 试图执行在 运行 时间构建的 PL/SQL 脚本,但得到

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

看起来像是脚本的格式问题,因为它显示为 STRING,但仍然不确定如何解决它。

下面是正在尝试的代码:

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)
set serveroutput on

不是PL/SQL命令,而是SQL*Plus命令,所以你只能在SQL*PLus中使用它。

甚至最后的 / 也应该删除,因为它也是 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!