1

A、B、C の 3 つの PLSQL 関数があります。

アイデアは次のとおりです。C が B を呼び出し、B が A を呼び出します。

  • 関数 A は、B によって呼び出されると、数値をステータス インジケーターとして返し、参照カーソルを表形式の結果とともに返します。例 function_A (varchar2 の A1、sys_refcursor の A2) は番号を返します。

  • 関数 B は、A から結果を受け取ると、結果を C に渡す前に、やはり参照カーソルの形式で再フォーマットする必要があります。

A は既存の機能であり、修正することはできませんが、B と C は完全に新しい機能になります。

問題は、A から ref カーソルを取得するにはどうすればよいかということです。関数によって返された数値 (つまり、ステータス インジケーター) を取得できましたが、A から参照カーソルの結果を取得するのに問題があります。

  1. B から A を呼び出している場合、A の ref カーソルが自動的に開かれていると想定できますか?

  2. A の参照カーソルから結果を取得するための論理的な手順は何ですか? たとえば、結果をオブジェクト型にフェッチできますか?

P/S。私はプログラミング経験が非常に限られており、PLSQL を始めて数か月しか経っていません。

どんなヒントでも大歓迎です。

4

2 に答える 2

0

たぶん、以下のスニペットを試すことができます。質問で言及したシナリオを再現しようとしました。お役に立てれば。

CREATE OR REPLACE FUNCTION A_TEST(
    A1 IN VARCHAR2,
    A2 OUT sys_refcursor )
  RETURN NUMBER
AS
  lv_num PLS_INTEGER;
BEGIN
  NULL;
  OPEN a2 FOR SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 19;
  RETURN 1;
END;

CREATE OR REPLACE FUNCTION B_TEST
  RETURN sys_refcursor
AS
  lv_cur sys_refcursor;
  lv_num PLS_INTEGER;
BEGIN
  lv_num:=A_TEST('AV',lv_cur);
  RETURN lv_cur;
END;



CREATE OR REPLACE FUNCTION C_TEST
  RETURN sys_refcursor
AS
  tab PLS_INTEGER;
  lv_cur sys_refcursor;
BEGIN
  lv_cur:=B_TEST;
  LOOP
    FETCH lv_cur INTO tab;
    EXIT
  WHEN lv_cur%NOTFOUND;
    dbms_output.put_line(tab);
  END LOOP;
END;
于 2016-03-29T07:20:02.117 に答える