Top > PLSQL プログラミング入門(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;
パイプラインしていない簡単な表関数の例
SQL> CREATE OR REPLACE TYPE tNumberList IS TABLE OF NUMBER; / -- または VARRY を用いても良い。(結合配列は TYPE 宣言できない) -- CREATE OR REPLACE TYPE tNumberList IS VARRAY(100) OF NUMBER; SQL> SELECT * FROM TABLE(tNumberList(100,20,30)) ORDER BY COLUMN_VALUE ASC; COLUMN_VALUE ------------ 20 30 100COLUMN_VALUE
マニュアルによると表関数を SELECT したときの COLUMN_VALUE という擬似列はキーワード COLUMN_VALUEは、列または属性名を持たない内部のネストした表の スカラー値に対してOracleデータベースが生成する名前です。同じ名前の擬似列に XML 関連の COLUMN_VALUE があるが直接関係ない。