是这样的,查询的是公司表bd_corp,三个字段unitcode,unitname,sealeddate。
其中在unitcode like '02%'的时候,sealeddate列会全部是null,这个时候查询的时候不要这一列,在unitcode like '01%'的时候,sealeddate不全是null,需要。
这个据说动态sql能搞定,但是没用过。
求人用过程写出的是:
CREATE OR REPLACE PROCEDURE print_corp(v_cur OUT Sys_Refcursor)
     AS
        v_count NUMBER;
     BEGIN
      SELECT COUNT(*) INTO v_count FROM bd_corp WHERE  unitcode like '01%'and  sealeddate IS NOT NULL;
      IF v_count >0 THEN
        OPEN v_cur FOR  SELECT  unitcode,unitname,sealeddate  FROM bd_corp;
       ELSE
        OPEN v_cur FOR  SELECT unitcode,unitname FROM bd_corp;
     END IF;
  END;
这个过程达到了根据公司表编码unitcode查询,如果查询结果的sealeddate列全是空值,不要这一列。
这个过程有一个缺点,
1,不能在PL/SQL Developer使用,必须在sqlplus中,因为使用了:
SQL> var v_cur refcursor
SQL> exec print_cur(:v_cur);
2,不能讲unitcode作为一个变量,每次查询不同的还要重新定义过程。
我想写成一个function,将unitcode作为一个变量,然后查询的时候可以直接select function(‘xx’) from dual。
请问可以吗?(据说sys_refcursor是oracle9i以后系统定义的一个refcursor,主要用在过程中返回结果集。)

解决方案 »

  1.   

    谁说不能在PL/SQL中使用啊,declare
    v_01 Sys_Refcursor; 
    ...
    begin
    print_corp(v_01);...
    end;这样就可以啊
      

  2.   

     
    declare 
      -- Local variables here
     v_cur Sys_Refcursor; 
     v_count NUMBER;
    begin
      -- Test statements here
      SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode like '02%'and sealeddate IS NOT NULL;
      IF v_count >0 THEN
      OPEN v_cur FOR SELECT unitcode,unitname,sealeddate FROM bd_corp;
      ELSE
      OPEN v_cur FOR SELECT unitcode,unitname FROM bd_corp;
      END IF;
     dbms_output.PUT_LINE(v_cur);
    end;
    你看这样做,最后用 dbms_output.PUT_LINE打印输入游标得到的结果,可是在PL/SQL Developer的test window通不过
     
      

  3.   

    declare
      -- Local variables here
    v_cur Sys_Refcursor;
    v_count NUMBER;
    begin
      -- Test statements here
      SELECT COUNT(*) INTO v_count FROM bd_corp WHERE unitcode like '02%'and sealeddate IS NOT NULL;
      IF v_count >0 THEN
      OPEN v_cur FOR SELECT unitcode,unitname,sealeddate FROM bd_corp;
      ELSE
      OPEN v_cur FOR SELECT unitcode,unitname FROM bd_corp;
      END IF;
    dbms_output.PUT_LINE(v_cur);
    end;
    可是不能通过,不知道 OUT Sys_Refcursor 能否直接写在块里还是我的最后 dbms_output.PUT_LINE(v_cur)有问题。