パイプライン関数は、独立関数またはパッケージ関数でなければなりません。本記事では、主にパイプライン関数の作成方法について説明します。
機能の適用範囲
この内容は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