ストアドプロシージャを呼び出すクライアントは、レコードセット出力のみを処理できます。
ただし、ストアドプロシージャは、いくつかの内部クエリの結果として単純な0または1の値を返すことになっています。
ストアドプロシージャの変数値を一種のレコードセットとして返すことができる回避策はありますか?
ストアドプロシージャを呼び出すクライアントは、レコードセット出力のみを処理できます。
ただし、ストアドプロシージャは、いくつかの内部クエリの結果として単純な0または1の値を返すことになっています。
ストアドプロシージャの変数値を一種のレコードセットとして返すことができる回避策はありますか?
カーソル変数を返します。プロシージャから返す値の SELECT .. FROM DUAL を使用してカーソル変数を開きます。
このプロシージャは、これらの値を含む単一の行を返すカーソルを返します。
あなたの手続きから
OPEN resultsCursor_ FOR
Select 1 As aValue FROM DUAL;
また
CREATE OR REPLACE PROCEDURE GetAValue
(
results_ OUT SYS_REFCURSOR
)
IS
MY_COUNT_ INT;
BEGIN
MY_COUNT_ := 10;
OPEN results_ FOR
SELECT MY_COUNT_ AS MyCount FROM DUAL;
END GetAValue;
プロシージャは値を返すことができません。これを行うには関数が必要です。
呼び出し元にカーソルを「返す」プロシージャが本当に必要な場合は、次のようなものを使用できます。
--Declare this type in a package X
--The caller must have access to the package X.
TYPE ref_cursor IS REF CURSOR;
CREATE OR REPLACE
PROCEDURE test (
p_param1 IN VARCHAR2,
p_cur OUT X.REF_CURSOR,
p_error_code OUT NUMBER,
p_error_message OUT VARCHAR2
)
AS
BEGIN
OPEN p_cur FOR
SELECT * FROM TABLE;
EXCEPTION
WHEN OTHERS THEN
p_error_code := SQLCODE;
p_error_message := SQLERRM;
END;
エラーが設定されていない場合、呼び出し元はこのカーソルを実行し、それに対して行をフェッチできます。