使用游标IN / OUT调用Oracle函数

时间:2015-07-07 21:29:35

标签: oracle plsql cursor

我试图简单地调用一个带有游标的函数(Test2),并返回一个游标。

我遇到了错误:
错误(23,17):PLS-00306:调用' TEST2 '

时参数的数量或类型错误

我的函数调用出了什么问题?

v_resp := TEST2(v_req);

这是我的测试:

CREATE OR REPLACE TYPE TRANS_OBJ AS OBJECT (TRANSNO CHAR(8));
CREATE OR REPLACE TYPE TRANS_OBJ_TAB AS TABLE OF TRANS_OBJ;

CREATE OR REPLACE FUNCTION TEST2 (v_rc IN SYS_REFCURSOR) RETURN TRANS_OBJ_TAB
IS
  v_resp TRANS_OBJ_TAB := TRANS_OBJ_TAB();

  BEGIN 
    v_resp.extend;
    v_resp(1) := TRANS_OBJ('222222');
    RETURN v_resp; 
  END;

CREATE OR REPLACE FUNCTION TEST1 RETURN TRANS_OBJ_TAB
IS
  TRANSNO   CHAR(8);
  v_cnt number := 0;
  v_req TRANS_OBJ_TAB := TRANS_OBJ_TAB();
  v_resp TRANS_OBJ_TAB := TRANS_OBJ_TAB();
  --v_resp sys_refcursor;      

  CURSOR v_rc IS SELECT '1111' AS TRANSNO FROM DUAL;

  BEGIN
      OPEN v_rc;

      LOOP
        fetch v_rc into TRANSNO;
        EXIT WHEN v_rc%NOTFOUND;

        v_req.extend;
        v_cnt := v_cnt + 1;
        v_req(v_cnt)  := TRANS_OBJ(TRANSNO);
      END LOOP;

      CLOSE v_rc;
      v_resp := TEST2(v_req);
      RETURN v_resp;
    END;
/
DROP TYPE TRANS_OBJ_TAB;
DROP TYPE TRANS_OBJ;
DROP FUNCTION TEST1;
DROP FUNCTION TEST2;

1 个答案:

答案 0 :(得分:1)

首先,你没有像你说的那样从TEST2函数返回CURSOR(尝试return sys_refcursor)。 另一方面,v_req不是sys_refcursor,除了v_resp也不能包含游标。查看您正在使用的类型。 希望这有帮助!!!