Как вернуть переменную из вызова PL/SQL блока?
Вызываю PL/SQL блок так:
sql = """
DECLARE
num NUMBER := 1;
res NUMBER;
BEGIN
res := num + 1;
END;
"""
try:
cursor.execute(sql)
print ("PL/SQL successfully executed.")
except cx_Oracle.DatabaseError as e:
print (e)
Этот код выполняется без проблем.
А как вернуть результат из вызова в переменнную Python?
Свободный перевод вопроса Return variable from cx_Oracle PL/SQL call in Python от участника @Michael Hecht
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
В основном есть две возможности:
Воспользоваться переменными связывания:
sql = """ DECLARE num NUMBER := :val; res NUMBER; BEGIN :res := num + 1; END; """ res = cursor.var (int) cursor.execute(sql, val=1, res=res) print (f"result is {res.getvalue()}") result is 2Преобразовать анонимный блок в функцию или процедуру (первый предпочтительней):
create or replace function func (i int) return int is begin return (i*2); end; / create or replace procedure proc (i int, res out int) is begin res := (i*2); end; /Вызов:
res = cursor.callfunc ('func', int, (1,)) print (f"result is {res}") res = cursor.var (int) cursor.callproc ('proc', [1, res]) print (f"result is {res.getvalue()}") result is 2 result is 2