テーブル値関数は、SELECTステートメントのFROM句内で実行できる関数です。 これらの関数は、TABLE
句を使用して行または列のデータに変換できるコレクションを返します。 変換されたデータはSQL文で処理できます。
シナリオ
テーブル値関数は、次のシナリオに適しています。
- SQL文を使用して異なるテーブルに格納されているデータをマージするなど、セッション内のデータテーブルをマージします。
- プログラミングによってデータセットを構築し、特定の形式でデータセットをクライアントに渡します。 テーブル値関数を使用して、リレーショナルテーブルを構築せずに構築されたデータセットを生成できます。
- パイプライン関数を使用した並列クエリのパフォーマンスの向上。 テーブル値関数は、所属するクエリをシリアル化でき、クエリのパフォーマンスを向上させることができます。
テーブル値関数の作成
- 関数の
RETURN
型は、コレクション型として定義する必要があります。 通常、コレクションはネストされたテーブルまたは変数配列です。 それはまた、関連するアレイであってもよい。説明 型は、CREATE type
ステートメントを使用してデータベースレベルで定義する必要があります。 パイプライン関数の場合、型はパッケージで定義することもできます。 - 関数のすべてのパラメーターは
in
モードで、SQL文と互換性がある必要があります。 たとえば、RECORD
型のパラメーターは、SQL文では許可されないため、関数では許可されません。 - 関数の呼び出しは、
TABLE
句に埋め込まれています。
例
テーブル値関数の作成
- ネストされたテーブルを作成します。
CREATE OR REPLACE TYPE polar_strings IS TABLE OF VARCHAR2 (100);
- ネストされたテーブル型を返すテーブル値関数を作成します。
CREATE OR REPLACE FUNCTION get_random_str (INTEGERでcount_in) RETURN polar_strings IS アイテムpolar_strings := polar_strings (); 開始 item.EXTEND (count_in); FOR i IN 1 .. count_in ループ アイテム (i) := DBMS_RANDOM.string ('u', 10); エンドループ; 返品アイテム。エンド;
- PL/SQLでテーブル値関数を呼び出して文字列を生成します。
次の出力が返されます。DECLARE アイテムpolar_strings := get_random_str (5); 開始 FOR i IN 1 .. アイテム. カウント ループ DBMS_OUTPUT.put_line (アイテム (i)); エンドループ; エンド;
CIDKUKWNMV GRSNSGJULU XXCMTMLYUI YWQDIMNEZA BHTWWLCGFN
テーブル値関数を呼び出します。
get_random_str
テーブル値関数を呼び出します。 パラメーター値は5に設定され、5つのランダムな文字列を返すように指定します。
次の出力が返されます。SELECT rs.COLUMN_VALUE my_string FROM TABLE (get_random_str (5)) rs
my_string ------------ JAFSOSYOUA VNWSAAAHNA MAEDHVHLIU PRWUJLPKZJ MWZKQZKQJZ (5行のレコード)
- 明示的に宣言された
count_in
パラメーター値を含むget_random_str
関数を呼び出します。 5つのランダムな文字列を返すように指定します。
次の出力が返されます。SELECT COLUMN_VALUE my_string FROM TABLE (get_random_str (count_in => 5))
my_string ------------ TRHYTVPPOU DJFDIYAYAF BKJOYQFAJR YCIIBEFSVT OYCUDMUDMX (5行のレコード)
- 5つのランダムな文字列を返す
get_random_str
関数を呼び出します。 次に、SUMおよびAVG関数が呼び出されて、5つのランダムな文字列の合計および平均の長さが返されます。
次の出力が返されます。SELECT SUM (LENGTH (COLUMN_VALUE)) total_length、 AVG (長さ (COLUMN_VALUE)) average_length FROM TABLE (get_random_str (5))
total_length | average_length -------------- --------------------- 50 | 10.0000000000000000 (1行のレコード)