Как получить буфер вывода записанный при вызове dbms_output.put_line?
Есть функция:
function func_list(
par1 varchar2, par2 varchar2, par2 varchar2,
p_lst out sys.odciVarchar2List) return varchar2;
Вызываю её так:
DECLARE
lst sys.odciVarchar2List;
st varchar2(20);
BEGIN
st:= func_list('PAR1','PAR2','PAR3', lst);
for i in 1..lst.count loop
dbms_output.put_line(lst(i));
end loop;
end;
Как в Python получить буфер вывода, который записывается при вызове dbms_output.put_line?
Пробовал callproc, но ничего не выводит. Возможно проблема в out odciVarchar2List.
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
В отличае от IDE, где часто вывод разрешён по умолчанию, в Python скрипте надо явно включить вывод до выполнения блока, который производит вывод. Подробнее в оф. док..
Воспроизводимый пример (установите chunksize для большего кол-ва выводимых строк):
sql = """
declare
lst sys.odciVarchar2List := sys.odciVarchar2List ('PAR1','PAR2','PAR3');
begin
for i in 1..lst.count loop
dbms_output.put_line ('lst('||i||')='||lst(i));
end loop;
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
Выведет:
lst(1)=PAR1
lst(2)=PAR2
lst(3)=PAR3