存储过程获得动态视图和返回值问题。问题比较多
select intid from a1352select intid from c1467
create or replace function test_ab(v_intid in varchar2) return varchar2 is out_intid varchar(10); v_sql varchar2(1000);begin dbms_output.put_line('v_intid= '||v_intid); v_sql:='create or replace view ab as select a.intid aa,c.intid bb from a,c where a.intid=c.intid and a.intid='''||v_intid||''''; execute immediate v_sql; select aa+bb into out_intid from ab; dbms_output.put_line('out_intid= '||out_intid); return(out_intid);end test_ab;select test_ab('1') from dualcreate or replace procedure test_ab(v_intid in out varchar2) isv_sql varchar2(1000);begin dbms_output.put_line('v_intid= '||v_intid); v_sql:='create or replace view ab as select a.intid aa,c.intid bb from a,c where a.intid=c.intid and a.intid='''||v_intid||''''; execute immediate v_sql; select aa+bb into v_intid from ab; dbms_output.put_line('v_intid= '||v_intid);end test_ab;create or replace function test_ab(v_intid in varchar2) return varchar2 is out_intid varchar(10); v_sql varchar2(1000);begin dbms_output.put_line('v_intid= '||v_intid); v_sql:='create or replace view ab as select a.intid aa,c.intid bb from a,c where a.intid=c.intid and a.intid='''||v_intid||''''; execute immediate v_sql; [color=#FF0000]execute immediate 'select aa+bb from ab' into out_intid;[/color] dbms_output.put_line('out_intid= '||out_intid); return(out_intid);end test_ab;declare l_ret varchar2(10);begin l_ret := test_ab('1'); dbms_output.put_line(l_ret);end;
[解决办法]
另外,过程是没有返回值的,如果test_ab是过程,调用方式就是
create or replace procedure test_ab(v_intid in varchar2) is out_intid varchar(10); v_sql varchar2(1000);begin dbms_output.put_line('v_intid= '||v_intid); v_sql:='create or replace view ab as select a.intid aa,c.intid bb from a,c where a.intid=c.intid and a.intid='''||v_intid||''''; execute immediate v_sql; execute immediate 'select aa+bb from ab' into out_intid; dbms_output.put_line('out_intid= '||out_intid);-- return(out_intid);end test_ab;begin test_ab('1');end;
[解决办法]
对,可以用out类型参数。稍微改一下就好。
create or replace procedure test_ab(v_intid in varchar2, out_intid out varchar2) is v_sql varchar2(1000);begin dbms_output.put_line('v_intid= '||v_intid); v_sql:='create or replace view ab as select a.intid aa,c.intid bb from a,c where a.intid=c.intid and a.intid='''||v_intid||''''; execute immediate v_sql; execute immediate 'select aa+bb from ab' into out_intid; dbms_output.put_line('out_intid= '||out_intid);-- return(out_intid);end test_ab;declare out_intid varchar(10);begin test_ab('1', out_intid); dbms_output.put_line(out_intid);end;
我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html