Выполнение PL / SQL-процедуры из python с sys.odcinumberlist в качестве параметра - PullRequest
3 голосов
/ 26 апреля 2019

С учетом процедуры PL / SQL:

PROCEDURE MyProc(myvar IN sys.odcinumberlist, curout OUT sys_refcursor);

Как мне выполнить ее из python, используя cx_Oracle?Я пытался

cursor.callproc('MyProc', (param, cursor_out))

с параметром [1, 2, 3] или cursor.arrayvar(cx_Oracle.NUMBER, [1, 2, 3]), но это приводит к ошибке «неправильное число или тип аргументов».

1 Ответ

2 голосов
/ 26 апреля 2019

Используйте conn.gettype для определения объекта SYS.ODCINUMBERLIST. Затем используйте его для назначения списка значений (чисел)

Пример процедуры

create or replace procedure MyProc( myvar  IN  sys.odcinumberlist, 
                                    curout OUT sys_refcursor )
AS
BEGIN
    open curout for select * from TABLE(myvar);
END;
/

Код Python

conn = cx_Oracle.connect('usr/pwd@//localhost:1521/DB')
cur = conn.cursor()

tableTypeObj  = conn.gettype("SYS.ODCINUMBERLIST")
params = tableTypeObj.newobject()

po_cursor_out = cur.var(cx_Oracle.CURSOR)

params = tableTypeObj([1,2,3])

cur.callproc('hr.myproc', [ params, po_cursor_out])
result_cur = po_cursor_out.getvalue()

for row in result_cur:
    print(row[0])

Результат

1
2
3
...