Как получить сигнатуру процедуры перед ее вызовом?
Допустим, есть процедура:
procedure proc (i_value in number, o_value out varchar2) is
begin null;
end proc;
OUT параметры, которые передаются в функцию callproc(), должны быть инициированы одним из типов:
cx_Oracle.NUMBER, cx_Oracle.STRING итд.
Обычно переменная, например, с именем out_value, получит o_value процедуры и перед передачей должна быть определена таким образом:
out_value = cur.var(cx_Oracle.STRING)
А как быть, если сигнатура процедуры заранее неизвестна?
Есть ли способ получить типы данных OUT параметров процедуры перед ее вызовом?
Свободный перевод вопроса cx_Oracle: Is there a way to get a stored procedure signature? от участника @p1ka2So
Ответы (1 шт):
В cx_Oracle нет встроенного API describe procedure_name.
Надо предварительно запросом получить метаданные из представлений словаря данных USER_PROCEDURES и USER_ARGUMENTS. Запрос может выглядеть так:
select a.position, a.argument_name, a.in_out, a.data_type
from user_procedures p
join user_arguments a on a.object_id=p.object_id
where p.object_name='PROC' and object_type='PROCEDURE';
/
POSITION ARGUMENT_NAME IN_OUT DATA_TYPE
---------- ---------------- --------- ------------------------------
1 I_VALUE IN NUMBER
2 O_VALUE OUT VARCHAR2
Свободный перевод ответа от участника @Christopher Jones