CREATE FUNCTION文は、スタンドアロン・ストアド・ファンクションまたはコール仕様を作成するか、または置き換えます。
スタンドアロン・ストアド・ファンクションは、データベースに格納されるファンクション(単一の値を戻すサブプログラム)です。
|
注意: CREATE FUNCTION文で作成するスタンドアロン・ストアド・ファンクションは、PL/SQLブロックまたはパッケージで宣言および定義するファンクションとは異なります。 後者の詳細は、「ファンクション宣言と定義」を参照してください。 |
コール仕様は、PL/SQLからコールできるようにJavaメソッドまたは第三世代言語(3GL)ルーチンを宣言します。 このようなメソッドまたはルーチンは、SQLのCALL文を使用してコールすることもできます。 コール仕様は、コール時に起動するJavaメソッドまたは共有ライブラリ内の名前付きファンクションをデータベースに指示します。 また、引数および戻り値に対して実行する型変換もデータベースに指示します。
前提条件
自身のスキーマ内にスタンドアロン・ストアド・ファンクションを作成するか、または自身のスキーマ内のスタンドアロン・ストアド・ファンクションを置き換えるには、CREATE PROCEDUREシステム権限が必要です。 別のユーザーのスキーマ内にスタンドアロン・ストアド・ファンクションを作成するか、または別のユーザーのスキーマ内のスタンドアロン・ストアド・ファンクションを置き換えるには、CREATE ANY PROCEDUREシステム権限が必要です。
コール仕様を起動するには、追加の権限が必要になる場合があります。たとえば、Cコール仕様の場合には、Cライブラリに対するEXECUTE権限が必要です。
CREATE FUNCTION文をOracleプリコンパイラ・プログラム内に埋め込むには、キーワードEND-EXECの後に特定の言語の埋込みSQL文の終了記号を付けて文を終了する必要があります。
|
参照: 前述の前提条件の詳細は、次のマニュアルを参照してください。
|
構文
create_function ::=

(parameter_declaration ::=、datatype ::=、result_cache_clause ::=、declare_section ::=、body ::=)


streaming_clause ::=

call_spec ::=

Java_declaration ::=

C_declaration ::=

キーワードとパラメータの説明
OR REPLACEを指定すると、ファンクションがすでに存在する場合に再作成できます。 この句を使用すると、既存のファンクションに以前に付与されたオブジェクト権限を削除、再作成および再付与しなくても、そのファンクションの定義を変更できます。 ファンクションを再定義すると、そのファンクションはデータベースによって再コンパイルされます。
再定義されたファンクションに対する権限を以前に付与されているユーザーは、権限を再付与される必要なく、ファンクションにアクセスできます。
ファンクション索引がファンクションに依存している場合は、データベースによってその索引にDISABLEDのマークが付けられます。
schema
ファンクションを含めるスキーマを指定します。 schemaを省略すると、データベースによって現行のスキーマにファンクションが作成されます。
function_name
作成するファンクションの名前を指定します。
datatypeには、ファンクションの戻り値のデータ型を指定します。 戻り値は、PL/SQLでサポートされているすべてのデータ型にすることができます。
|
注意: Oracle SQLでは、ブール値のパラメータまたは戻り値を持つファンクションのコールはサポートされていません。 したがって、ユーザー定義ファンクションがSQL文からコールされる場合は、数値(0または1)または文字列(TRUEまたはFALSE)を戻すように設計する必要があります。 |
データ型で長さ、精度または位取りを指定することはできません。 戻り値の長さ、精度または位取りは、ファンクションがコールされた環境からデータベースによって導出されます。
戻り型がANYDATASETであり、問合せのFROM句でファンクションを使用する場合は、PIPELINED句を指定し、ファンクションの実装タイプの一部としてdescribeメソッド(ODCITableDescribe)を定義する必要もあります。
このデータ型は、NOT NULLなどでは制約することができません。
|
参照:
|
メンバー・ファンクションのAUTHIDプロパティおよびオブジェクト型のプロシージャを指定します。 AUTHIDプロパティの詳細は、「実行者権限または定義者権限の使用(AUTHID句)」を参照してください。
CURRENT_USERの権限でファンクションを実行する場合は、CURRENT_USERを指定します。 この句は実行者権限ファンクションを作成します。
また、この句は、問合せ、DML操作および動的SQL文の外部名がCURRENT_USERのスキーマで解決されるように指定します。 その他すべての文に含まれる外部名は、このファンクションが存在するスキーマで解決されます。
ファンクションが存在するスキーマの所有者の権限でファンクションを実行し、ファンクションが存在するスキーマでその外部名を解決する場合は、DEFINERを指定します。 これがデフォルトです。これによって、定義者権限ファンクションが作成されます。
|
参照:
|
ファンクションがそのパラメータの同じ値でコールされたときに常に同じ結果値を戻すことを示すには、DETERMINISTICを指定します。
このキーワードは、ファンクション索引の式に指定するか、あるいはREFRESH FASTまたはENABLE QUERY REWRITEとマークされたマテリアライズド・ビューの問合せからファンクションをコールする場合に指定する必要があります。 データベースでは、このようなコンテキストの1つで決定的ファンクションが検出されると、ファンクションが再実行されるのではなく、以前に計算した結果の使用が可能なかぎり試行されます。 その後、このファンクションのセマンティクスを変更する場合は、依存するすべてのファンクション索引およびマテリアライズド・ビューを手動で再構築する必要があります。
パッケージ変数を使用するファンクション、またはファンクションから戻される結果に影響を与える可能性のある方法でデータベースにアクセスするファンクションを定義する場合は、この句を指定しないでください。 データベースでファンクションが再実行されない場合、この句を指定しなかった結果は取得されません。
DETERMINISTIC句の使用は、次のセマンティック規則によって制御されます。
トップレベルのサブプログラムDETERMINISTICを宣言できます。
パッケージレベルのサブプログラムDETERMINISTICは、パッケージ仕様部では宣言できますが、パッケージ本体では宣言できません。
(別のサブプログラム内またはパッケージ本体内で宣言される)プライベートのサブプログラムDETERMINISTICは宣言できません。
DETERMINISTICサブプログラムは、コールされるプログラムがDETERMINISTICを宣言されているかどうかに関係なく、別のサブプログラムをコールできます。
|
参照:
|
PARALLEL_ENABLEは、パラレル問合せ操作のパラレル実行サーバーからファンクションを実行できることを示す最適化ヒントです。 このファンクションでは、パッケージ変数などのセッション状態は使用しないでください。このような変数がパラレル実行サーバー間で共有されているとはかぎらないためです。
オプションのPARTITION argument BY句は、REF CURSOR引数型のファンクションでのみ使用します。 この句を使用すると、REF CURSOR引数からファンクションへの入力のパーティション化を定義できます。
ファンクションへの入力のパーティション化は、ファンクションが問合せのFROM句内のテーブル・ファンクションとして使用された場合の問合せのパラレル化の方法に影響します。 ANYは、データをパラレル実行サーバー間でランダムにパーティション化できることを示します。 また、指定した列リストにRANGEまたはHASHパーティション化を指定することもできます。
オプションのstreaming_clauseを使用すると、指定した列リストでパラレル処理を順序付けまたはクラスタ化できます。
ORDER BYは、パラレル実行サーバー上の行はローカルで順序付けする必要があることを示します。
CLUSTER BYは、パラレル実行サーバー上の行に、column_listで指定されたキー値と同じキー値が必要であることを示します。
exprは、パーティション化が指定されているテーブル・ファンクション、およびパラレル問合せの実行時に各スレーブの順序付けまたはクラスタ化を指定する列を持つテーブル・ファンクションのREF CURSORパラメータの名前を示します。
これらすべてのオプション句で指定された列は、ファンクションのREF CURSOR引数によって戻される列を参照します。
|
参照: ユーザー定義の集計ファンクションの詳細は、次のマニュアルを参照してください。
|
PIPELINEDを指定すると、テーブル・ファンクションの結果を反復的に戻すようにデータベースに指示できます。 テーブル・ファンクションは、コレクション型(ネストした表またはVARRAY)を戻します。 問合せのFROM句のファンクション名の前にTABLEキーワードを使用して、テーブル・ファンクションを問い合せます。 次に例を示します。
SELECT * FROM TABLE(function_name(...))
これによって、ファンクションで行が生成されると、データベースによってその行が戻されます。
キーワードPIPELINEDを単独で指定する場合(PIPELINED IS ...)は、PL/SQLファンクション本体でPIPEキーワードを使用する必要があります。 このキーワードは、コレクション全体を単一の値として戻すのではなく、コレクションの個々の要素をファンクションから戻すようにデータベースに指示します。
開始、フェッチおよび終了の操作が含まれるインタフェースを事前定義する場合は、PIPELINED USING implementation_type句を指定できます。 実装タイプは、ODCITableインタフェースを実装する必要があります。また、テーブル・ファンクションの作成時に存在している必要があります。 この句は、C++やJavaなどの外部言語で実装されるテーブル・ファンクションに便利です。
ファンクションの戻り型がANYDATASETである場合は、ファンクションの実装タイプの一部としてdescribeメソッド(ODCITableDescribe)も定義する必要があります。
AGGREGATE USINGを指定すると、このファンクションを集計ファンクションまたは行のグループを評価して単一行を戻すファンクションとして指定できます。 集計ファンクションは、選択リスト、HAVING句およびORDER BY句で指定できます。
問合せでユーザー定義の集計ファンクションを指定すると、分析ファンクション(問合せ結果セットで機能するファンクション)として処理できます。 これを行うには、組込み分析ファンクションで使用可能なOVER analytic_clause構文を使用します。 分析ファンクションの構文およびセマンティクスは、『Oracle Database SQL言語リファレンス』を参照してください。
USING句には、ファンクションの実装タイプの名前を指定します。 この実装タイプは、ODCIAggregateルーチンの実装が含まれているオブジェクト型にする必要があります。 schemaを指定しない場合、実装タイプは自身のスキーマ内に存在するとみなされます。
集計ファンクションの作成の制限 この句を指定する場合、ファンクションに対して指定できる入力引数は1つのみです。
|
参照: ODCIルーチンの詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。 |
body
ファンクションの必須の実行部、およびオプションでファンクションの例外処理部。
declare_section
ファンクションのオプションの宣言部。 宣言は、ファンクションに対してローカルであり、bodyで参照でき、ファンクションが実行を完了すると消滅します。
call_spec
call_specを使用すると、JavaまたはCのメソッド名、パラメータ型および戻り型を対応するSQLにマップできます。 Java_declarationでは、stringはメソッドのJava実装を示します。
|
参照:
|
EXTERNAL
以前のリリースでは、EXTERNALはCメソッドを宣言する場合の代替方法でした。 この句は非推奨となっており、下位互換性のためにのみサポートされています。 LANGUAGE C構文を使用することをお薦めします。
ファンクションの作成: 例 次の文は、サンプルの表oe.ordersにファンクションget_balを作成します。
CREATE FUNCTION get_bal(acc_no IN NUMBER)
RETURN NUMBER
IS acc_bal NUMBER(11,2);
BEGIN
SELECT order_total
INTO acc_bal
FROM orders
WHERE customer_id = acc_no;
RETURN(acc_bal);
END;
/
get_balファンクションは、指定した口座の残高を戻します。
このファンクションをコールする場合は、引数acc_no(残高を確認する口座の番号)を指定する必要があります。 acc_noのデータ型はNUMBERです。
このファンクションは口座の残高を戻します。 CREATE FUNCTION文にRETURN句を指定すると、戻り値のデータ型がNUMBERになります。
このファンクションは、SELECT文を使用して、引数acc_noで識別される行のbalance列をorders表で選択します。 次に、RETURN文を使用して、ファンクションがコールされた環境にこの値を戻します。
前述の例で作成したファンクションは、SQL文で使用できます。 次に例を示します。
SELECT get_bal(165) FROM DUAL;
GET_BAL(165)
------------
2519
次に示す仮定の文は、Cルーチンc_get_valを外部ファンクションとして登録するPL/SQLスタンドアロン・ファンクションget_valを作成します。 (この例ではパラメータを省略しています。)
CREATE FUNCTION get_val
( x_val IN NUMBER,
y_val IN NUMBER,
image IN LONG RAW )
RETURN BINARY_INTEGER AS LANGUAGE C
NAME "c_get_val"
LIBRARY c_utils
PARAMETERS (...);
集計ファンクションの作成: 例 次の文は、数値を集計するSecondMaxという名前の集計ファンクションを作成します。 オブジェクト型SecondMaxImplルーチンに、ODCIAggregateルーチンの実装が含まれていることを想定しています。
CREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;
|
参照: SecondMaxImplの型および型本体の完全な実装の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。 |
このような集計ファンクションは、サンプル表hr.employeesを問い合せる次の文のような問合せで使用します。
SELECT SecondMax(salary) "SecondMax", department_id
FROM employees
GROUP BY department_id
HAVING SecondMax(salary) > 9000
ORDER BY "SecondMax", department_id;
SecondMax DEPARTMENT_ID
--------- -------------
13500 80
17000 90
ファンクションでのパッケージ・プロシージャの使用: 例 次の文は、DBMS_LOB.GETLENGTHプロシージャを使用してCLOB列の長さを戻すファンクションを作成します。
CREATE OR REPLACE FUNCTION text_length(a CLOB) RETURN NUMBER DETERMINISTIC IS BEGIN RETURN DBMS_LOB.GETLENGTH(a); END;
|
参照: このファンクションを使用してファンクション索引を作成する場合の例は、『Oracle Database SQL言語リファレンス』を参照してください。 |
関連トピック
ファンクション宣言と定義(PL/SQLブロック内でのファンクションの作成の詳細)
|
参照:
|