ヘッダーをスキップ
Oracle® Database PL/SQL言語リファレンス
11gリリース2 (11.2)
B56260-09
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

CREATE FUNCTION文

CREATE FUNCTION文は、スタンドアロン・ファンクションまたはコール仕様を作成するか、または置き換えます。

スタンドアロン・ファンクションは、データベースに格納されるファンクション(単一の値を戻すサブプログラム)です。


注意:

CREATE FUNCTION文で作成するスタンドアロン・ファンクションは、PL/SQLブロックまたはパッケージで宣言および定義するファンクションとは異なります。後者の詳細は、「ファンクションの宣言および定義」を参照してください。

コール仕様は、PL/SQLから起動できるようにJavaメソッドまたは第三世代言語(3GL)サブプログラムを宣言します。このようなメソッドまたはサブプログラムは、SQLのCALL文を使用して起動することもできます。コール仕様は、起動時に起動するJavaメソッドまたは共有ライブラリ内の名前付きファンクションをデータベースに指示します。また、引数および戻り値に対して実行する型変換もデータベースに指示します。


注意:

ストアド・ファンクションは、副作用を制御する特定の規則に従っている場合にのみ、SQL文からコールできます。詳細は、「サブプログラムの副作用」を参照してください。

ここでのトピック

前提条件

自分のスキーマ内にスタンドアロン・ファンクションを作成するか、または自分のスキーマ内のスタンドアロン・ファンクションを置き換えるには、CREATE PROCEDUREシステム権限が必要です。別のユーザーのスキーマ内にスタンドアロン・ファンクションを作成するか、または別のユーザーのスキーマ内のスタンドアロン・ファンクションを置き換えるには、CREATE ANY PROCEDUREシステム権限が必要です。

コール仕様を起動するには、追加の権限が必要になる場合があります。たとえば、Cコール仕様の場合には、Cライブラリに対するEXECUTE権限が必要です。

CREATE FUNCTION文をOracleプリコンパイラ・プログラム内に埋め込むには、キーワードEND-EXECの後に特定の言語の埋込みSQL文の終了記号を付けて文を終了する必要があります。


関連項目:

前述の前提条件の詳細は、次のマニュアルを参照してください。
  • 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』

  • 『Oracle Database Java開発者ガイド』


セマンティクス

OR REPLACE

ファンクションが存在する場合は、ファンクションを再作成し、再コンパイルします。

再定義する前のファンクションに対する権限を付与されていたユーザーは、権限を再付与される必要なく、ファンクションにアクセスできます。

ファンクション索引がファンクションに依存している場合は、データベースによってその索引にDISABLEDのマークが付けられます。

schema

ファンクションが含まれているスキーマの名前。デフォルト: 自分のスキーマ。

function_name

作成するファンクションの名前。


注意:

SQL*Moduleによって生成されたスタブを使用してストアド・サブプログラムを起動する場合、ストアド・サブプログラム名は、起動側ホストの3GL言語(AdaやCなど)の有効な識別子である必要もあります。

RETURN datatype

datatypeには、ファンクションの戻り値のデータ型を指定します。戻り値は、PL/SQLでサポートされているすべてのデータ型にすることができます。


注意:

Oracle SQLでは、BOOLEANパラメータまたは戻り値を持つファンクションの起動はサポートされていません。したがって、ユーザー定義ファンクションを起動するSQL文の場合は、数値(0または1)または文字列(TRUEまたはFALSE)を戻すように設計する必要があります。

データ型で長さ、精度または位取りを指定することはできません。戻り値の長さ、精度または位取りは、ファンクションがコールされた環境からデータベースによって導出されます。

戻り型がANYDATASETであり、問合せのFROM句でファンクションを使用する場合は、PIPELINED句を指定し、ファンクションの実装タイプの一部としてdescribeメソッド(ODCITableDescribe)を定義する必要もあります。

このデータ型は、NOT NULLなどでは制約することができません。


関連項目:

  • PL/SQLデータ型の詳細は、第3章「PL/SQLのデータ型」を参照してください。

  • ODCITableDescribeファンクションの定義の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。


invoker_rights_clause

プロシージャのAUTHIDプロパティを指定します。AUTHIDプロパティの詳細は、「実行者権限および定義者権限(AUTHIDプロパティ)」を参照してください。

DETERMINISTIC

ファンクションがそのパラメータの同じ値でコールされたときに常に同じ結果値を戻すことを示します。

このキーワードは、ファンクション索引の式に指定するか、あるいはREFRESH FASTまたはENABLE QUERY REWRITEとマークされたマテリアライズド・ビューの問合せからファンクションを起動する場合に指定する必要があります。データベースでは、このようなコンテキストの1つで決定的ファンクションが検出されると、ファンクションが再実行されるのではなく、以前に計算した結果の使用が可能なかぎり試行されます。その後、このファンクションのセマンティクスを変更する場合は、依存するすべてのファンクション索引およびマテリアライズド・ビューを手動で再構築する必要があります。

パッケージ変数を使用するファンクション、またはファンクションから戻される結果に影響を与える可能性のある方法でデータベースにアクセスするファンクションを定義する場合は、この句を指定しないでください。データベースでファンクションが再実行されない場合、この句を指定しなかった結果は取得されません。

DETERMINISTIC句の使用は、次のセマンティック規則によって制御されます。

  • スキーマレベルのサブプログラムDETERMINISTICを宣言できます。

  • パッケージレベルのサブプログラムDETERMINISTICは、パッケージ仕様部では宣言できますが、パッケージ本体では宣言できません。

  • (別のサブプログラム内またはパッケージ本体内で宣言される)プライベートのサブプログラムDETERMINISTICは宣言できません。

  • DETERMINISTICサブプログラムは、コールされるプログラムがDETERMINISTICを宣言されているかどうかに関係なく、別のサブプログラムを起動できます。


関連項目:

  • マテリアライズド・ビューの詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。

  • ファンクション索引の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。


parallel_enable_clause

パラレル問合せ操作のパラレル実行サーバーからファンクションを実行できることを示します。このファンクションでは、パッケージ変数などのセッション状態は使用しないでください(このような変数がパラレル実行サーバー間で共有されているとはかぎらないためです)。

  • オプションのPARTITION argument BY句は、REF CURSORデータ型のファンクションでのみ使用します。この句を使用すると、REF CURSOR引数からファンクションへの入力のパーティション化を定義できます。

    ファンクションへの入力のパーティション化は、ファンクションが問合せのFROM句内のテーブル・ファンクションとして使用された場合の問合せのパラレル化の方法に影響します。ANYは、データをパラレル実行サーバー間でランダムにパーティション化できることを示します。また、指定した列リストにRANGEまたはHASHパーティション化を指定することもできます。


    注意:

    テーブル・ファンクションの弱いカーソル変数引数をパーティション化するには、RANGEHASHではなく、ANYのみを使用します。

  • オプションのstreaming_clauseを使用すると、指定した列リストでパラレル処理を順序付けまたはクラスタ化できます。

    • ORDER BYは、パラレル実行サーバー上の行はローカルで順序付けする必要があることを示します。

    • CLUSTER BYは、パラレル実行サーバー上の行に、column_listで指定されたキー値と同じキー値が必要であることを示します。

    • exprは、パーティション化が指定されているテーブル・ファンクション、およびパラレル問合せの実行時に各スレーブの順序付けまたはクラスタ化を指定する列を持つテーブル・ファンクションのREF CURSORパラメータの名前を示します。

これらすべてのオプション句で指定された列は、ファンクションのREF CURSOR引数によって戻される列を参照します。


関連項目:

パラレル・テーブル・ファンクションを使用する方法の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

PIPELINED { IS | USING }

テーブル・ファンクションの結果を反復的に戻すようにデータベースに指示します。テーブル・ファンクションは、コレクション型(ネストした表または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句で指定できます。

問合せでユーザー定義の集計ファンクションを指定すると、分析ファンクション(問合せ結果セットで機能するファンクション)として処理できます。これを行うには、SQL分析ファンクションで使用可能なOVER analytic_clause構文を使用します。分析ファンクションの構文およびセマンティクスは、『Oracle Database SQL言語リファレンス』を参照してください。

USING句には、ファンクションの実装タイプの名前を指定します。この実装タイプは、ODCIAggregateサブプログラムの実装が含まれているADTにする必要があります。schemaを指定しない場合、実装タイプは自分のスキーマ内に存在するとみなされます。

AGGREGATE USINGの制限 この句を指定する場合、ファンクションに対して指定できる入力引数は1つのみです。


関連項目:

  • ユーザー定義の集計関数の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

  • ODCIサブプログラムの詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。


body

ファンクションの必須の実行部、およびオプションでファンクションの例外処理部。

declare_section

ファンクションのオプションの宣言部。宣言は、ファンクションに対してローカルであり、bodyで参照でき、ファンクションが実行を完了すると消滅します。

call_spec

Cプロシージャ名またはJavaメソッド名、パラメータ型および戻り型を、対応するSQLにマップします。java_declarationでは、stringはメソッドのJava実装を示します。c_declarationLIBRARY lib_nameでは、「CREATE LIBRARY文」によって作成されたライブラリを識別します。


関連項目:

  • Javaコール仕様を作成する方法は、『Oracle Database Java開発者ガイド』を参照してください。

  • Cコール仕様を作成する方法は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。


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という名前の集計ファンクションを作成します。ADTの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
--------- -------------
      9450           100
  13670.74            50
     14175            80
   18742.5            90

ファンクションでのパッケージ・プロシージャ: 例 次の文は、DBMS_LOB.GETLENGTHプロシージャを使用してCLOB列の長さを戻すファンクションを作成します。

CREATE OR REPLACE FUNCTION text_length(a CLOB) 
   RETURN NUMBER DETERMINISTIC IS
BEGIN 
  RETURN DBMS_LOB.GETLENGTH(a);
END;

関連トピック

この章:

他の章:


関連項目:

  • CALL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • SQL文からコールされるユーザー定義ファンクションの制限の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

  • コール仕様の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。