Dynami c привязка аргумента в Dynami c вызов хранимой процедуры oracle - PullRequest
0 голосов
/ 04 марта 2020

У меня есть требование не только динамически вызывать хранимую процедуру, но и динамически передавать параметры этой хранимой процедуре.

Аргументы исходят из таблицы ALL_ARGUMENTS, которая является таблицей словаря данных Oracle. Эти аргументы будут варьироваться в зависимости от rpt_wrapper_name.

Например, sp1 будет выглядеть следующим образом:

sp1 (v1, v2, v3)  

Хранимая процедура sp2 будет выглядеть следующим образом:

sp2 (v1, v2, v3, v4, v5) 

Хранимая процедура sp3 будет выглядеть следующим образом:

sp3 (v1, v2, v3, v4, v5, v6, v7,...) 

В настоящее время я пытаюсь выполнить динамический вызов c SQL, но это не работает для меня

EXECUTE IMEDIATE 'BEGIN ' || p_Rpt_wrapper_name|| '(' || p_ParamList || ') ; END;'
Using  p_ParamListUsing;

where  
p_ParamList := :v1,:v2,:v3
p_ParamListUsing:= v1,v2,v3

Ошибка:

Не все переменные как связаны ORA-01008

Список параметров будет варьироваться в зависимости от rpt_wrapper_name

Как мы можем этого добиться? Пожалуйста, помогите

1 Ответ

0 голосов
/ 05 марта 2020

Метод 1:

Измените процедуры так, чтобы они принимали таблицу аргументов.

type r_para is record(
    parameter_name   varchar2(32),
    parameter_vc     varchar2(32000),
    parameter_nb     number,
    parameter_dt     date);
type t_para is table of r_para;

procedure p1(p_parameters t_para);

И вызов

v_para_list.append( r_para ('ref_time',null,null,sysdate);
execute immediate 'proc2(:pin_para)' using v_para_list;

Метод 2:

Использование Dynami c sql https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/dynamic-sql.html#GUID -1D6A4302-CBA0-47A6- B4A7-80B089DF4E61

c := DBMS_SQL.OPEN_CURSOR(true);
DBMS_SQL.PARSE(c, 'BEGIN get_employee_info(:id); END;', DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(c, ':id', 176);
n := DBMS_SQL.EXECUTE(c);
...