create or replace procedure aaa(aa in scott.emp%rowtype) as begin dbms_output.put_line(aa.ename); end; / set serveroutput on;declare begin for c1 in (select * from scott.emp) loop aaa(c1); end loop; end; /
rowtype类型没办法转化为字符串的吧,使用动态语句调用貌似不行啊正常调用,参考1楼的写法
我这边具体是一个包里的多个过程,通过配置,在调度时通过读取配置来执行具体过程。一楼方式适合单一的,不适用批量的调用。 我想通过 动态的 begin end 来实现。现在也能实现,就是调用时每个过程传参太多,就是要传个对象,而不是具体的类型。 不知道dbms_sql里是否可以这么调用
execute immediate 可以执行一个代码段的, 可以连同生成rowtype的代码一起传过来,动态执行传过来的代码段 execute immediate 'declare a table.column%rowtype; begin
end;'
里面调过程你测试了吗?我测试后不行才来咨询的。create or replace aaa(aa in scott.emp%rowtype) asbegindbms_output.put_line(aa.ename);end; declare v_sql varchar2(4000); v_row_emp emp%rowtype; begin v_sql := 'begin aaa(:v1) end'; execute immediate v_sql using v_row_emp;报参数类型不对
我意思是把你整个过程的语句都动态传进来 execute immediate 'declare v_row_emp emp%rowtype; begin aaa(v_row_emp) end;'; 这样传递的参数为varchar2类型,而不是rowtype类型
begin
dbms_output.put_line(aa.ename);
end;
/
set serveroutput on;declare
begin
for c1 in (select * from scott.emp) loop
aaa(c1);
end loop;
end;
/
我想通过 动态的 begin end 来实现。现在也能实现,就是调用时每个过程传参太多,就是要传个对象,而不是具体的类型。
不知道dbms_sql里是否可以这么调用
可以连同生成rowtype的代码一起传过来,动态执行传过来的代码段
execute immediate
'declare
a table.column%rowtype;
begin
end;'
declare
v_sql varchar2(4000);
v_row_emp emp%rowtype;
begin
v_sql := 'begin aaa(:v1) end';
execute immediate v_sql using v_row_emp;报参数类型不对
execute immediate
'declare
v_row_emp emp%rowtype;
begin
aaa(v_row_emp)
end;';
这样传递的参数为varchar2类型,而不是rowtype类型