日期:2014-05-17  浏览次数:20744 次

动态select语句返回数据集
定义一个函数,就一个参数,是传入的select语句,返回一个记录集。
网上说可以使用table()来做,但是实验了很多次都解决不了,求高手指点。

------解决方案--------------------
引用:
定义一个函数,就一个参数,是传入的select语句,返回一个记录集。
网上说可以使用table()来做,但是实验了很多次都解决不了,求高手指点。



ChenZw> CREATE OR REPLACE TYPE TABLEOFTAPEVARCHAR2 IS TABLE OF NUMBER;
  2  /

类型已创建。

ChenZw> CREATE OR REPLACE FUNCTION GETDATA
  2  RETURN TABLEOFTAPEVARCHAR2
  3  IS
  4  BEGIN
  5    RETURN TABLEOFTAPEVARCHAR2('1','2','3');
  6  END;
  7  /

函数已创建。

ChenZw> SELECT * FROM TABLE(GETDATA);

COLUMN_VALUE
------------
           1
           2
           3

已选择3行。


------解决方案--------------------

--这个函数允许你输入一个select语句并返回一个游标变量
CREATE OR REPLACE FUNCTION REF_EMP(V_S IN VARCHAR2) RETURN SYS_REFCURSOR IS
  REF_EMP SYS_REFCURSOR;
BEGIN
  OPEN REF_EMP FOR V_S;
  RETURN REF_EMP;
END;



DECLARE
  V_SQL     VARCHAR2(100) := 'SELECT *  FROM emp'; --这个就是你输入的select
  V_EMP     EMP%ROWTYPE;
  V_EMP_REF SYS_REFCURSOR;
BEGIN
  V_EMP_REF := REF_EMP(V_SQL);--调用函数

  FETCH V_EMP_REF
    INTO V_EMP;
  LOOP
    EXIT WHEN V_EMP_REF%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);
    FETCH V_EMP_REF
      INTO V_EMP;
  END LOOP;
  CLOSE V_EMP_REF;

END;