パイプライン関数は、独立関数またはパッケージ関数でなければなりません。本記事では、主にパイプライン関数の作成方法について説明します。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供しています。
主要構文
パイプライン関数の主な構文は以下のとおりです。完全な関数作成構文については、CREATE FUNCTIONを参照してください。 pipelined_clause の構文は次のとおりです:
PIPELINED
{ [ USING [schema.] implementation_type ]
| { ROW | TABLE } POLYMORPHIC [ USING [schema.] implementation_package ]
}
PIPE ROW の構文は次のとおりです:
PIPE ROW ( row ) ;
parallel_enable_clause の構文は次のとおりです:
PARALLEL_ENABLE
[ (PARTITION argument BY
{ ANY
| { HASH | RANGE } (column [, column ]...) [ streaming_clause ]
| VALUE (column)
}
)
return_statement の構文は次のとおりです:
RETURN [ expression ] ;
構文の説明
スタンドアロン関数の場合は、
CREATE FUNCTIONステートメントでPIPELINEDオプションを指定します。パッケージ関数の場合は、関数宣言と関数定義の両方でPIPELINEDオプションを指定します。パイプライン関数をパラレル実行するには、
PARALLEL_ENABLEオプションを指定して有効にすることを推奨します。パイプライン関数がDMLステートメントを実行する場合は、
PRAGMA AUTONOMOUS_TRANSACTION;を使用して自律性を持たせます。その後、パラレル実行中に関数の各インスタンスは独立したトランザクションを作成します。同一クエリまたは個別のクエリでパイプライン関数を複数回呼び出すと、基盤となる実装が複数回実行されます。関数が決定的である場合は、
DETERMINISTICオプションを指定してください。通常、パイプライン関数には1つ以上のカーソル変数パラメータがあります。カーソル変数の詳細については、カーソル変数を参照してください。
パイプライン関数では、
PIPE ROWステートメントを使用してコレクション要素を呼び出し元に返しますが、制御権は呼び出し元に返しません。関数内の各実行パスは、制御権を呼び出し元に返す
RETURNステートメントを指していなければなりません。ただし、パイプライン関数では、RETURNステートメントは値を呼び出し元に返す必要はありません。
返されるデータ型
パイプライン関数が返す値のデータ型は、スキーマレベルまたはパッケージ内で定義された集合型でなければなりません(結合配列型ではありません)。集合型の要素はSQLデータ型でなければならず、PLのみがサポートするデータ型(例えば PLS_INTEGER および BOOLEAN)ではありません。
SQLデータ型 ANYTYPE および ANYDATA を使用して、他の任意のSQL型(オブジェクトや集合型を含む)の型記述、データインスタンス、データインスタンスセットを動的にカプセル化およびアクセスできます。
例
obclient> CREATE OR REPLACE PACKAGE pkg_pi AUTHID DEFINER AS
TYPE numset_tbl IS TABLE OF NUMBER;
FUNCTION fuc(n NUMBER) RETURN numset_tbl PIPELINED;
END pkg_pi;
/
Query OK, 0 rows affected
obclient> CREATE OR REPLACE PACKAGE BODY pkg_pi AS
FUNCTION fuc(n NUMBER) RETURN numset_tbl PIPELINED IS
BEGIN
FOR i IN 1..n LOOP
PIPE ROW(i);
END LOOP;
RETURN;
END fuc;
END pkg_pi;
/
Query OK, 0 rows affected
obclient> SELECT * FROM TABLE(pkg_pi.fuc(6));
+--------------+
| COLUMN_VALUE |
+--------------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+--------------+
5 rows in set
obclient> SELECT * FROM TABLE(pkg_pi.fuc(3));
+--------------+
| COLUMN_VALUE |
+--------------+
| 1 |
| 2 |
| 3 |
+--------------+
2 rows in set