我有存储过程A。B,现在要在A里调用B。B有返回值,请问:我如何从A中得到B的返回值?
我是这样的调用的。
v_sql :='call '||s_proname||' ('||v_sqltemp||')';
execute immediate v_sql;s_proname是存储过程名。入参v_sqltemp是动态拼起来的。我现在要得到s_proname存储过程中的返回值。
我是这样的调用的。
v_sql :='call '||s_proname||' ('||v_sqltemp||')';
execute immediate v_sql;s_proname是存储过程名。入参v_sqltemp是动态拼起来的。我现在要得到s_proname存储过程中的返回值。
execute immediate v_sql into 这个变量;
如果是几个,那相应的定义几个。
v_sql := 'call '||s_proname|| ' ('''||v_sqltemp||''') '; 代码贴全点?
declare
v_param1 number;
v_param2 varchar2(20);
v_sql varchar2(100);
begin
v_param1 := 1; v_sql := 'call p_exatest(:param1,:param2)';
execute immediate v_sql using v_param1, v_param2;
dbms_output.put_line(v_param2);
end;
/
s_proname varchar2(200);--存储过程名称
v_sql varchar2(50); --调用存储过程sql
v_sqltemp varchar2(200);--拼参数的sql
retcode varchar2(20);--获得执行存储过程的返回值
s_prodesc varchar2(160);--存储过程描述
s_start_date date;--程序开始时间
s_end_date date;--程序结束时间
cursor myCursor(s_proname varchar2) is
select
pp.parvalue
from mof_pro_name pn,
mof_pro_parameter pp
where pn.id = pp.proid
and pn.proname=s_proname
order by pp.parnum asc;
begin retcode:='';
s_start_date:=sysdate;
DBMS_OUTPUT.PUT_LINE(s_start_date);
select pn.proname,
pn.prodesc
into s_proname,s_prodesc
from mof_pro_name pn
where pn.id = 1;
for results in myCursor(s_proname)
loop
v_sqltemp:=v_sqltemp||','''||results.parvalue||'''';
end loop;
v_sqltemp:=substr(v_sqltemp,2,length(v_sqltemp))||',''''';
--call test
v_sql :='call '||s_proname||' ('||v_sqltemp||')';
DBMS_OUTPUT.PUT_LINE(v_sql);
execute immediate v_sql into retcode;
DBMS_OUTPUT.PUT_LINE(retcode);
s_end_date:=sysdate;
DBMS_OUTPUT.PUT_LINE(s_end_date);
--向日志表中插入数据
end mof_projob1;
我贴出我的程序,请大家看看了。
你可以打印下v_sql := 'call '||s_proname|| ' ( '||v_sqltemp|| ') ';
你这个sqltemp是没有''分割的create or replace procedure testa1
(sqlstmt in varchar2,refcursor out sys_refcursor)
as
begin
open refcursor
for sqlstmt;
end;
/declare
sqlstmt varchar2(100):='select 1 id from dual';
refcursor sys_refcursor;
vid number(1);
begin
--testa1(sqlstmt,refcursor);
execute immediate 'call testa1(:1,:2)' using sqlstmt,refcursor;
loop
fetch refcursor into vid;
exit when refcursor%notfound;
dbms_output.put_line(vid);
end loop;
end;
/
楼上把你的游标类型改成 out参数是varchar2类型的试试看?我这里死也出不来,说说IN 绑定变量绑定到 OUT 位置,但是用游标就没问题
drop table emp;
create table emp(A varchar2(10),B varchar2(10),C varchar2(10));
insert into emp values('1','1','1');
insert into emp values('2','2','2');
insert into emp values('3','3','3');commit;create or replace procedure p_test_dym(
i_A in varchar2,
o_B out varchar2
)
as
begin
select B into o_B from emp where emp.A = i_A;
end;
/create or replace procedure p_call_dym(
v_proc in varchar2,
v_param in varchar2
)
as
v_2 emp.B%TYPE;
begin
execute immediate 'call '||v_proc||'(:1,:2)' using in v_param,out v_2;
dbms_output.put_line(v_2);
end;
/exec p_call_dym('p_test_dym','2');