三流備忘録OracleのSQL PL/SQL 関数 ついての備忘録
カーソル(REF CURSOR)
解説
結果セットのポインタみたいなもの。
クライアントとの間で問い合わせの結果セットを渡すために使用できる。
宣言(戻り値型なし)
TYPE 変数名 IS REF CURSOR;
宣言(戻り値型あり)
TYPE 変数名 IS REF CURSOR RETURN 型;
%ROWTYPEを戻すカーソル変数
DECLARE
TYPE hoge_type IS REF CURSOR RETURN tblHoge%ROWTYPE;
hoge hoge_type;
BEGIN
NULL;
END;
%TYPEを戻すカーソル変数
DECLARE
/* +++++++++++++++++++++++++++++++++++++++++++++++++++
レコード変数のデータ型をあえる
++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
hoge_rec tblHoge%ROWTYPE;
TYPE hoge_type IS REF CUROSR RETURN hoge_rec%TYPE;
hoge hoge_type;
BEGIN
NULL;
END;
レコード型を戻すカーソル変数
DECLARE
TYPE hogeRec IS (hogeid number,hogename varchar2(30));
TYPE hoge_type IS REF CURSOR hogerec;
hoge hoge_type;
BEGIN
NULL;
END;
カーソル変数からレコードへフェッチ
DECLARE
TYPE hoge_type IS REF CURSOR RETURN tbl_Hoge%ROWTYPE;
cur_hoge hoge_type;
rec_hoge tbl_Hoge%rowtype;
BEGIN
OPEN cur_hoge FOR SELECT * FROM tbl_Hoge WHERE hogeid BETWEEN 1 AND 10;
LOOP
FETCH cur_hoge INTO rec_hoge;
EXIT WHEN cur_hoge%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(rec_hoge.hogeID);
END LOOP;
CLOSE cur_hoge;
END;
REF CURSORをオープンするストアド
/* +++++++++++++++++++++++++++++++++++++++++++++++++++
パッケージ仕様部
++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
CREATE OR REPLACE PACKAGE HOGE_DATA
--REF CURSOR
TYPE hoge_type IS REF CURSOR;
--プロシージャ
PROCEDURE OPEN_HOGE_DATA( hoge_cv IN OUT hoge_type , kbn INT);
END HOGE_DATA;
/* +++++++++++++++++++++++++++++++++++++++++++++++++++
パッケージ本体
++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
CREATE OR REPLACE PACKAGE BODY HOGE_DATA AS
--プロシージャ
PROCEDURE OPEN_HOGE_DATA( hoge_cv IN OUT hoge_type , kbn INT) IS
BEGIN
--カーソルオープン
IF kbn = 1 THEN
OPEN hoge_cv FOR SELECT * FROM tbl_HOGE;
ELSIF kbn = 2 THEN
OPEN hoge_cv FOR SELECT * FROM tbl_HOGEHOGE;
END IF;
END;
END HOGE_DATA;