CREATE OR REPLACE PROCEDURE Get_user(MYCUR OUT SYS_REFCURSOR) IS 
BEGIN 
OPEN MYCUR FOR 
select SSLMMSTF_STFCD,Trim(SSLMMSTF_STFNM2) as SSLMMSTF_STFNM2,SSLMMSTF_PASSWORD from SSLMM_STAFF; 
END Get_user;能不能像上面这么写?还是必须用包?

解决方案 »

  1.   

    CREATE OR REPLACE PACKAGE PKG_GetList
    AS
      TYPE refcursor IS REF CURSOR; PROCEDURE GetList( 
    rst  OUT  refcursor 
    ) ;
    END; 
    /
    create or replace package body PKG_GetListPROCEDURE GetList(
    rst  OUT  refcursor 

    IS 
    BEGIN 
     OPEN rst FOR 
      select SSLMMSTF_STFCD,Trim(SSLMMSTF_STFNM2) as SSLMMSTF_STFNM2,SSLMMSTF_PASSWORD from SSLMM_STAFF ;END GetList; 
    end;
      

  2.   


    这种OUT SYS_REFCURSOR的方式可能是不行的,我一直没有试成功过,哪位调试成功了发个demo看看?建议采用建包定义type的方式
      

  3.   

    SYS_REFCURSOR类型从oracle 9i引入,具体行不行,就看你的oracle版本了。
    如果支持,当然是用SYS_REFCURSOR方便了。
      

  4.   

    给个例子:
    SQL> select * from test;       AAA BBB
    ---------- ----------
             1 a
             2 b
             3 cSQL> create procedure test_p(mycur out sys_refcursor)
      2  as
      3  begin
      4  open mycur for select * from test;
      5  end;
      6  /过程已创建。SQL> var get_val refcursor
    SQL> exec test_p(:get_val)PL/SQL 过程已成功完成。SQL> print get_val       AAA BBB
    ---------- ----------
             1 a
             2 b
             3 cSQL> 
      

  5.   

    为啥我在pl/sql里写var get_val refcursor
    就提示refcursor不存在
      

  6.   

    我试试了下,两种都可以,但是为啥我在pl/sql里写var get_val refcursor 
    就提示refcursor不存在
      

  7.   

    我试试了下,两种都可以,在oracle10g 下,但是不明白两种方式有什么区别和好处呢》
      

  8.   

    到目前为止SYS_REFCURSOR在9i中我是没有使用成功过。
    我一般使用包。这样也一样啊。
    一样调用,只是多了一个包名+"."而已。
    而且写的存储过程还很好分类。
      

  9.   


    昨天怎么使用sys_refcursor过程编译都通不过,
    今天修改了oracle字符集,再重建了xdb方案后,
    无意中rebuild这个存储过程,竟然编译通过了,执行也正常了,呵呵
    真是奇怪的问题难道这两个操作引起了什么改动吗?困惑
      

  10.   


    你少写了冒号吧
    SQL> create or replace procedure test(mycursor out sys_refcursor) is 
      2  begin
      3     open mycursor for select * from emp;
      4  end test;
      5  /Procedure created.SQL> var c1 sys_refcursor;
    Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
                        VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
                        NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR |
                        BINARY_FLOAT | BINARY_DOUBLE ] ]SQL> var c1 refcursorSQL> exec test(:c1);PL/SQL procedure successfully completed.SQL> print :c1;     EMPNO ENAME      JOB              MGR HIREDATE            SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------ ---------- ---------- ----------
          7369 SMITH      CLERK           7902 17-DEC-80           800                    20
          7499 ALLEN      SALESMAN        7698 20-FEB-81          1600        300         30
          7521 WARD       SALESMAN        7698 22-FEB-81          1250        500         30
          7566 JONES      MANAGER         7839 02-APR-81          2975                    20
          7654 MARTIN     SALESMAN        7698 28-SEP-81          1250       1400         30
          7698 BLAKE      MANAGER         7839 01-MAY-81          2850                    30
          7782 CLARK      MANAGER         7839 09-JUN-81          2450                    10
          7788 SCOTT      ANALYST         7566 19-APR-87          3000                    20
          7839 KING       PRESIDENT            17-NOV-81          5000                    10
          7844 TURNER     SALESMAN        7698 08-SEP-81          1500          0         30
          7876 ADAMS      CLERK           7788 23-MAY-87          1100                    20
          7900 JAMES      CLERK           7698 03-DEC-81           950                    30
          7902 FORD       ANALYST         7566 03-DEC-81          3000                    20
          7934 MILLER     CLERK           7782 23-JAN-82          1300                    1014 rows selected.