CREATE OR REPLACE PROCEDURE test

  v_a IN NUMBER DEFAULT NULL ,
  cv_1 OUT SYS_REFCURSOR,
  cv_2 OUT SYS_REFCURSOR

as
begin
open cv_1 for select 'aa' from dual;if(v_a is not null)then
begin
open cv_2 for select 'bb' from dual;
end;
endif;
end如果v_a 是空的话,外面填充dateset时会报"未执行语句句柄" 错误,
但是我就是不想open cv_2 for ,只想dateset有一个table;外面对table.count 做一些业务判断。不想改
请问如何处理。

解决方案 »

  1.   


    CREATE OR REPLACE PROCEDURE test

      v_a IN NUMBER DEFAULT NULL ,
      cv_1 OUT SYS_REFCURSOR)
    as
    begin
    if v_a is not null then
    open cv_2 for select 'bb' from dual;
    else
    open cv_2 for select 'aa' from dual;
    end  if; 
    end;
    ----打住
      

  2.   

    cv_2是没打开。
    必须打开吗。OPEN cv_2 FOR SELECT NULL FROM DUAL where 1=2;可以这样,主要是我想实现,
    返回数据集根据实际情况,不固定是2个table
      

  3.   


    已经写给你了  后面的dual 改成你条件的不同表就可以了  自己改
      

  4.   

    呵呵,可能我描述不清,
    目前,我想实现根据业务有时返回一个table,有时返回两个table
    不想dataset固定总是两个table
    但是,如果cv_2不打开的话,就报异常。
    好像,只有不想要cv_2时,也得返回两个table.
      

  5.   


    create or replace procedure test 
    (v_a in number default null,
     c1 out sys_refcursor,
     c2 out sys_refcursor)
    is
     stmt varchar2(100);
    begin
     open c1 for select 'aa' from dual; if v_a is not null then
      stmt:='begin open :c for select ''bb'' from dual; end;';
      execute immediate stmt using c2;
     end if;
    end;
    /
      

  6.   

    我引用的是.net 的
    system.data.oracleclient.dll(oracle自己的dll没事,但是不想用那个)
    用报这个异常,,报错是由于定义cv_2为输出游标,但没有打开。
    引发异常:  System.Data.OracleClient.OracleException: ORA-24338: 未执行语句句柄