説明
CREATE FUNCTION ステートメントは、独立関数または呼び出し仕様を作成または置き換えるために使用されます。独立関数とは、データベース内に格納される関数(単一の値を返すサブプログラム)を指します。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
注意
CREATE FUNCTION ステートメントで作成される独立関数は、PLブロックやパッケージ内で宣言・定義される関数とは異なります。
前提条件
スキーマ内で独立関数を作成または置き換えるには、CREATE FUNCTION のシステム権限が必要です。別のユーザーのスキーマ内で独立関数を作成または置き換えるには、CREATE ANY FUNCTION のシステム権限が必要です。
構文
create_function の構文は次のとおりです:
CREATE [ OR REPLACE ]
FUNCTION plsql_function_source
ここで、plsql_function_source の構文は次のとおりです:
[ schema. ] function_name
[ ( parameter_declaration [, parameter_declaration]... ) ]
RETURN datatype [ sharing_clause ]
[ invoker_rights_clause
| accessible_by_clause
| DETERMINISTIC
| parallel_enable_clause
| result_cache_clause
| default_collation_clause
| pipelined_clause
]...
{ { AGGREGATE | PIPELINED } USING [ schema. ] implementation_type
| [ PIPELINED ] { IS | AS } { [ declare_section ] body
| call_spec
}
} ;
セマンティクス
構文 |
キーワードまたは構文ノード |
説明 |
|---|---|---|
| create_function | OR REPLACE | 既存の場合はその関数を再作成し、再コンパイルします。関数を再定義する前にその関数に対する権限を付与されたユーザーは、再度権限を取得することなく引き続きその関数にアクセスできます。関数に依存する関数ベースのインデックスがある場合、データベースはそのインデックスを DISABLED としてマークします。 |
| plsql_function_source | schema | 関数が存在するスキーマ名。デフォルト値は現在ユーザーのスキーマです。 |
| plsql_function_source | function_name | 作成する関数名。 |
| plsql_function_source | RETURN datatype | データ型については、関数の戻り値のデータ型を指定してください。戻り値はPLがサポートする任意のデータ型にすることができます。 |
| plsql_function_source | body | 関数に必要な実行可能部分、および関数の例外処理部分(オプション)。 |
| plsql_function_source | declare_section | 関数のオプション宣言部分。宣言は関数に対してローカルであり、body 内で参照できます。関数の実行終了後は存在しなくなります。 |
| plsql_function_source | DETERMINISTIC | この関数が決定的であることを示します。つまり、同じ入力パラメータに対して常に同じ結果を返すことを意味します。これはクエリのパフォーマンス最適化に重要です。 |
| plsql_function_source | parallel_enable_clause | この関数が並列クエリで安全に実行できることを示します。この特性を指定する場合、関数は決定性、データベース状態の変更なし、セッション状態への依存なしといった条件を満たしている必要があります。 |
例
関数 get_salary_by_dept を作成します。
CREATE OR REPLACE FUNCTION get_salary_by_dept(
v_in_dept_id NUMBER,
v_out_emp_count OUT NUMBER)
RETURN NUMBER
IS
v_sum NUMBER;
BEGIN
SELECT SUM(salary), count(*) INTO v_sum, v_out_emp_count
FROM employees WHERE deptno=v_in_dept_id;
RETURN v_sum;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Dept id '||v_in_dept_id||' not found');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR: '||SQLCODE||': '||SQLERRM);
END get_salary_by_dept;
/
パラレルクエリで安全に実行できる関数を作成します。
CREATE OR REPLACE FUNCTION sub_query_result(input VARCHAR)
DETERMINISTIC
PARALLEL_ENABLE
RETURN VARCHAR
IS
result tp_sys_para.para_value%type;
BEGIN
SELECT tp.para_value INTO result
FROM tp_sys_para tp
WHERE tp.para_name_e = input;
RETURN result;
END;
/