Это решение не очень хорошее, но оно работает.Возможно, вы можете начать с этого и сделать что-то лучше:
Я использовал 2 параметра в функции doIt -
1) команду для немедленного выполнения
2) аргументы в виде типа anydata
В выполненииНемедленная команда Я применил всю логику от перевода anydata к некоторому типу, который я создал, чтобы обернуть параметры IN OUT.
вот код:
тип, подобный этому, должен быть создан для каждой отдельной команды:
create or replace type some_type as object(a number, b number);
/
это процедура:
create or replace procedure doIt(aa in varchar2, param IN OUT anydata) is
begin
execute immediate aa using in out param;
end doIt;
/
и вот как я это называю (в этом примере я просто выбрал count (*) из двойного в некоторый параметр OUT):
declare
i number;
prm some_type;
ad anydata;
a number;
b number;
begin
prm := new some_type(a,b);
ad := anydata.convertobject(prm);
doIt('declare prmAd anydata := :0; prm1 some_type; x number; begin x := prmAd.getobject(prm1); select count(*) into prm1.a from dual; :0 := anydata.convertobject(prm1); end;', ad);
i := ad.GetObject(prm);
dbms_output.put_line(prm.a);
end;
в основном вы можете добавить в процедуру doIt все, что захотите,и запустите с ним любую команду.
Я думаю, вы можете сделать что-то полезное - переместить часть строки непосредственного выполнения в процедуру doIt, возможно, лучше объявить тип и т. д.