Как передать коллекцию комплексного типа в процедуру?
Есть процедура в пакете:
create or replace package pack as
type arr is table of number index by pls_integer;
procedure proc (par arr);
end;
/
Согласно гл. Binding PL/SQL Collections, такой код для вызова этой процедуры работает:
arr = [1,2,3]
cursor = conn.cursor()
cursor.callproc ("pack.proc2", [arr])
Хочу теперь вызывать процедуру с коллекцией комплексного типа:
create or replace package pack as
type rec is record (id int, name varchar2 (8));
type tab is table of rec;
procedure proc (par tab);
end;
/
В документации, откуда взят рабочий пример выше, о коллекциях с комплексным типом данных вообще не упоминается.
Как можно передать коллекцию комплексного типа в процедуру?
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
Объявленные в PL/SQL записи и коллекции с ними являются расширением к DB API, и должны быть получены как объекты типа ObjectType из соединения.
Подготовка схемы для воспроизводимого примера:
create table t (id int, name varchar2 (8));
create or replace package pack as
type rec is record (id int, name varchar2 (8));
type tab is table of rec;
procedure proc (par tab);
end;
/
create or replace package body pack as
procedure proc (par tab) is
begin
forall i in indices of par
insert into t values (par(i).id, par(i).name);
end;
end;
/
Код вызова процедуры:
from cx_Oracle import connect
conn = connect ('connect_string')
recobj = conn.gettype ("PACK.REC")
tabobj = conn.gettype ("PACK.TAB")
tab = tabobj.newobject ()
rec = recobj.newobject ()
rec.ID = 1
rec.NAME = "aaa"
tab.append (rec)
rec = recobj.newobject ()
rec.ID = 2
rec.NAME = "bbb"
tab.append (rec)
with conn.cursor () as cursor:
cursor.callproc ("pack.proc", [tab])
conn.commit ()
Результат:
select * from t
/
ID NAME
---------- --------
1 aaa
2 bbb