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内で参照でき、関数の実行完了後には存在しなくなります。 |
例
関数 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;
/