Top > PLSQL プログラミング入門(2) > 表関数
表関数、パイプライン・テーブルファンクション
表関数で指定レコードを持つ DUAL 表(ビュー)を作成する(サンプル1)
-- DUAL 表の骨組みをタイプで再現 DROP TYPE RIVUS.DUMMY_RSET; -- CREATE OR REPLACE TYPE RIVUS.DUMMY_T AS OBJECT ( DUMMY VARCHAR2(1) ); / -- DUAL もどき表のレコードセットを定義 CREATE OR REPLACE TYPE RIVUS.DUMMY_RSET AS TABLE OF DUMMY_T; / -- DUAL もどき表を作成する関数の定義 CREATE OR REPLACE FUNCTION RIVUS.X_GENERATOR(P_RECMAX NUMBER) RETURN DUMMY_RSET PIPELINED IS BEGIN FOR I IN 1..P_RECMAX LOOP -- DUMMY_T に 'X' をセットしてパイプ PIPE ROW(DUMMY_T('X')); END LOOP; RETURN; END; / -- DUAL もどき表関数を ビューで安定化? DUALx10 の完成 DROP VIEW RIVUS.DUALx10; CREATE VIEW RIVUS.DUALx10 AS SELECT * FROM TABLE(X_GENERATOR(10)); -- 完成 SELECT * FROM DUALx10; 表関数を使って半角カタカナをひらがなに変換する (サンプル2)
-- 変換ターゲットの表 ( ID, NAME で構成 ) ※手抜きで外部表ではありません CREATE TABLE RIVUS.ID_NAME ( ID VARCHAR2(10), NAME VARCHAR2(40) ); -- DROP TYPE RIVUS.ID_NAME_RSET; -- 表の骨組みをタイプで定義 CREATE OR REPLACE TYPE RIVUS.ID_NAME_T AS OBJECT ( ID VARCHAR2(10) ,NAME VARCHAR2(40) ); / -- レコードセットを定義 CREATE OR REPLACE TYPE RIVUS.ID_NAME_RSET AS TABLE OF ID_NAME_T; / -- ID, NAME 表を作成する関数の定義 CREATE OR REPLACE FUNCTION RIVUS.FUNC_TRANS_ID_NAME( P_CUR IN SYS_REFCURSOR ) RETURN ID_NAME_RSET PIPELINED IS vID VARCHAR2(10); vName VARCHAR2(40); -- vRec ID_NAME%ROWTYPE; BEGIN LOOP FETCH P_CUR INTO vID, vName; -- or INTO vRec EXIT WHEN P_CUR%NOTFOUND; vNAME:= TO_FULL_KANA(vName); PIPE ROW(ID_NAME_T(vID, vName)); END LOOP; RETURN; END; / -- 表関数を ビューに変換 DROP VIEW RIVUS.ID_NAME_TRANS; CREATE VIEW RIVUS.ID_NAME_TRANS AS SELECT * FROM TABLE(FUNC_TRANS_ID_NAME(CURSOR(SELECT * FROM ID_NAME))); -- INSERT INTO 〜 SELECT /*+ APPEND */ * FROM ID_NAME_TRANS; シンプルな表関数
表関数 関連事項 |