Как обойти ошибку при выполнении скрипта: ORA-00922: missing or invalid option?
Пытаюсь выполнить PL/SQL скрипт:
script = '''
Set serveroutput on;
DECLARE
req pls_integer;
BEGIN
req := infomediary_nse.request(
p_inApp_id => 100,
p_inPayload => XMLTYPE('<tag>hello</tag>'));
END;
/'''
connection = cx_Oracle.connect(ConnectionString)
str, err = connection.cursor().execute(script)
Но получаю:
cx_Oracle.DatabaseError: ORA-00922: missing or invalid option
Похоже на проблему с форматированием скрипта, но пока не знаю, как ее решить.
Свободный перевод вопроса cx_Oracle.DatabaseError: ORA-00922: missing or invalid option when trying to execute pl/sql от участника @Mohd Faheem
Ответы (1 шт):
Ошибка заключается в том, что cx_Oracle не знает понятия - скрипт. Каждый запрос или вызов анонимного блока, процедуры или функци, это отдельная единица выполнения. Кроме того, не следует слепо копировать фрагменты кода из IDE. Они могут содержать команды или символы самого IDE, но которые не являются частью синтаксиса SQL или PL/SQL.
В данном случае это: set serveroutput on и завершающие символы: ;, /.
Простой рабочий пример вкл. считывание буфера вывода dbms_output:
sql = """
declare
payload XMLType := XMLType ('<tag>hello</tag>');
begin
dbms_output.put_line('payload='||payload.getStringVal());
end;
"""
cursor.callproc ("dbms_output.enable")
cursor.execute (sql)
chunksize = 100
lines = cursor.arrayvar (str, chunksize)
numlines = cursor.var (int)
numlines.setvalue (0, chunksize)
while True:
cursor.callproc ("dbms_output.get_lines", (lines, numlines))
nl = numlines.getvalue()
linearr = lines.getvalue()[:nl]
for line in linearr:
print(line or "")
if nl < chunksize:
break
# payload=<tag>hello</tag>