1) create or replace procedure DataSet_SingleRows
(para out number)
is
i number := 0;
n number := 1;
cursor cursor1 is select dm from tmp_proc;
begin   
select count(1) into i from user_objects where object_name='TMP_PROC';
if (i > 0) then   
execute immediate 'drop table tmp_proc';
end if;
execute immediate 'create global temporary table tmp_proc (dm number,mc number)';
while (n < 10)
loop
execute immediate 'insert into tmp_proc values(,)';
n := n + 1;
end loop;
open cursor1;
fetch cursor1 into para;
end DataSet_SingleRows;
如果事先没有这张临时表的表,执行这个存储过程就会抛错,怎么解决?2) 如何通过procedure返回一个结果集? 上面也只能返回一条记录.

解决方案 »

  1.   

    两个例子,自己看一下吧
    1. 
    CREATE OR REPLACE PROCEDURE showemps (where_in IN VARCHAR2 := NULL) 
    IS
       cur INTEGER := DBMS_SQL.OPEN_CURSOR;
       rec emp%ROWTYPE; fdbk INTEGER;
    BEGIN
       DBMS_SQL.PARSE (cur, 'SELECT empno, ename FROM emp ' || 
          ' WHERE ' || NVL (where_in, '1=1'), DBMS_SQL.NATIVE);   DBMS_SQL.DEFINE_COLUMN (cur, 1, 1);
       DBMS_SQL.DEFINE_COLUMN (cur, 2, 'a', 60);   fdbk := DBMS_SQL.EXECUTE (cur);
       LOOP
          EXIT WHEN DBMS_SQL.FETCH_ROWS (cur) = 0;
          DBMS_SQL.COLUMN_VALUE (cur, 1, rec.empno);
          DBMS_SQL.COLUMN_VALUE (cur, 2, rec.ename);
          DBMS_OUTPUT.PUT_LINE (TO_CHAR (rec.empno) || '=' || rec.ename);
       END LOOP;
       DBMS_SQL.CLOSE_CURSOR (cur);
    END;2.
    CREATE OR REPLACE PACKAGE pkg_sql AS
    TYPE myrcType IS REF CURSOR;
    FUNCTION get(strsql VARCHAR) RETURN myrcType;
    END pkg_sql;
    CREATE OR REPLACE PACKAGE BODY PKG_SQL AS
    FUNCTION get(strsql IN VARCHAR) RETURN myrcType IS
    rc myrcType;
    BEGIN
    OPEN rc FOR strsql;
    RETURN rc;
    END get;
    END pkg_sql;
      

  2.   

    package返回cursor就可以是数据集。
      

  3.   

    存储过程中的OUT参数类型用sys_refcursor就行了
      

  4.   

    能不能只用procedure而不通过package返回呢?sxfwang()  能不能在我的基础上改改而不是使用dbms_sql?