CREATE FUNCTION ステートメント (PL/SQL)

CREATE FUNCTION ステートメントは、データベース内に格納されるスカラー関数またはパイプライン関数を定義します。

呼び出し方法

スカラー関数は、呼び出されるたびに単一値を返し、通常は SQL 式が有効な場合には必ず有効になります。 パイプライン関数は、一度に 1 行ずつ表の計算を実行し、SELECT ステートメントの FROM 節で参照可能です。

このステートメントは、Db2® コマンド行プロセッサー、サポートされる対話式 SQL インターフェース、アプリケーション、またはルーチンから実行できます。

許可

ステートメントの許可 ID によって保持される特権には、少なくとも以下のいずれか 1 つが含まれていなければなりません。
  • 関数のスキーマ名がない場合は、データベースに対する IMPLICIT_SCHEMA 権限
  • 関数のスキーマ名が既存のスキーマを参照する場合は、スキーマに対する CREATEIN 特権
  • DBADM 権限

ステートメントの許可 ID によって保持される特権には、関数本体で指定される SQL ステートメントの呼び出しに必要なすべての特権も含まれていなければなりません。

OR REPLACE が指定されている場合は、ステートメントの許可 ID は、対応する関数の所有者でなければなりません (SQLSTATE 42501)。

構文

構文図を読む構文図をスキップするCREATE OR REPLACE FUNCTIONname(,parameter-nameINOUTIN OUTdata-typedefault-clause)RETURNreturn-type PIPELINED ISASdeclarationBEGINstatement EXCEPTIONWHENexceptionORexceptionTHENstatementENDname

説明

CREATE FUNCTION ステートメントは、関数の名前、オプション・パラメーター、関数の戻りタイプ、および関数の本体を指定します。 関数の本体は、BEGIN キーワードと END キーワードで囲まれるブロックです。 そこには、定義済みの例外条件の発生時に行うアクションを定義する、オプションの EXCEPTION セクションを含めることができます。

OR REPLACE
スキーマ内に同じ名前の関数が既存の場合には新しい関数が既存の関数と置き換わることを示します。 このオプションを指定しない場合、新しい関数によって、同じスキーマ内の同名の既存の関数を置き換えることはできません。
FUNCTION name
関数の ID を指定します。
parameter-name
パラメーターの名前を指定します。 パラメーター・リストにある他の parameter-name と同じ名前は指定できません (SQLSTATE 42734)。
data-type
サポートされる PL/SQL データ・タイプの 1 つを指定します。
RETURN return-type
関数によって返されるスカラー値のデータ・タイプを指定します。
PIPELINED
作成する関数がパイプライン関数であることを指定します。
IS または AS
関数本体を定義するブロックを導入します。
declaration
1 つ以上の変数、カーソル、または REF CURSOR 型宣言を指定します。
statement
1 つ以上の PL/SQL プログラム・ステートメントを指定します。 各ステートメントの末尾は、セミコロンでなければなりません。
exception
例外条件名を指定します。

PL/SQL 関数は、データベース・マネージャーで管理されないオブジェクトの状態を変更するアクションを行うことはできません。

CREATE FUNCTION ステートメントを難読化形式でサブミットできます。 難読化されたステートメントでは、関数名のみを判読できます。 ステートメントの他の部分は判読できないようにエンコードされますが、データベース・サーバーはその部分をデコードできます。 難読化ステートメントの作成は、DBMS_DDL.WRAP 関数を呼び出すことによって行えます。

以下の例は、パラメーターがない基本的な関数を示しています。
CREATE OR REPLACE FUNCTION simple_function
    RETURN VARCHAR2
IS
BEGIN
    RETURN 'That''s All Folks!';
END simple_function;
以下の例は、2 つの入力パラメーターがある関数を示しています。
CREATE OR REPLACE FUNCTION emp_comp (
     p_sal           NUMBER,
     p_comm          NUMBER )
RETURN NUMBER
IS
BEGIN
    RETURN (p_sal + NVL(p_comm, 0)) * 24;
END emp_comp;
以下の例は、2 行からなる表を返すパイプライン関数を示しています。
CREATE TYPE row_typ as OBJECT(f1 NUMBER, f2 VARCHAR2(10))

CREATE TYPE arr_typ as TABLE OF row_typ

CREATE FUNCTION pipe_func
RETURN arr_typ
PIPELINED
IS
BEGIN
    PIPE ROW (1, 'one');
    PIPE ROW (2, 'two');
    RETURN;
END pipe_func;