CREATE FUNCTION ステートメント (PL/SQL)
CREATE FUNCTION ステートメントは、データベース内に格納されるスカラー関数またはパイプライン関数を定義します。
呼び出し方法
スカラー関数は、呼び出されるたびに単一値を返し、通常は SQL 式が有効な場合には必ず有効になります。 パイプライン関数は、一度に 1 行ずつ表の計算を実行し、SELECT ステートメントの FROM 節で参照可能です。
このステートメントは、Db2® コマンド行プロセッサー、サポートされる対話式 SQL インターフェース、アプリケーション、またはルーチンから実行できます。
許可
- 関数のスキーマ名がない場合は、データベースに対する IMPLICIT_SCHEMA 権限
- 関数のスキーマ名が既存のスキーマを参照する場合は、スキーマに対する CREATEIN 特権
- DBADM 権限
ステートメントの許可 ID によって保持される特権には、関数本体で指定される SQL ステートメントの呼び出しに必要なすべての特権も含まれていなければなりません。
OR REPLACE が指定されている場合は、ステートメントの許可 ID は、対応する関数の所有者でなければなりません (SQLSTATE 42501)。
構文
説明
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;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;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;