ヘッダーをスキップ
Oracle Database PL/SQL言語リファレンス
11g リリース1(11.1)
E05670-03
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

CREATE PROCEDURE文

CREATE PROCEDURE文は、スタンドアロン・ストアド・プロシージャまたはコール仕様を作成するか、または置き換えます。

スタンドアロン・ストアド・プロシージャとは、データベースに格納されるプロシージャ(特定のアクションを実行するサブプログラム)です。


注意:

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

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

前提条件

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

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

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


参照:

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

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


構文

create_procedure ::=

create_procedure
create_procedure.gifの説明

parameter_declaration ::=declare_section ::=body ::=

invoker_rights_clause ::=

invoker_rights_clause
invoker_rights_clause.gifの説明

call_spec ::=

call_spec
call_spec.gifの説明

Java_declaration ::=

Java_declaration
java_declaration.gifの説明

C_declaration ::=

C_declaration
c_declaration.gifの説明

キーワードとパラメータの説明

OR REPLACE

OR REPLACEを指定すると、プロシージャがすでに存在する場合に再作成できます。 この句を使用すると、既存のプロシージャに以前に付与されたオブジェクト権限を削除、再作成および再付与しなくても、そのプロシージャの定義を変更できます。 プロシージャを再定義すると、そのプロシージャはデータベースによって再コンパイルされます。

再定義されたプロシージャに対する権限を以前に付与されているユーザーは、権限を再付与される必要なく、プロシージャにアクセスできます。

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

schema

プロシージャを含めるスキーマを指定します。 schemaを省略すると、データベースによって現行のスキーマにプロシージャが作成されます。

procedure_name

作成するプロシージャの名前を指定します。

invoker_rights_clause

メンバー・ファンクションのAUTHIDプロパティおよびオブジェクト型のプロシージャを指定します。 AUTHIDプロパティの詳細は、「実行者権限または定義者権限の使用(AUTHID句)」を参照してください。

AUTHID CURRENT_USER

CURRENT_USERを指定すると、CURRENT_USERの権限でプロシージャを実行できます。 この句は実行者権限プロシージャを作成します。

また、この句は、問合せ、DML操作および動的SQL文の外部名がCURRENT_USERのスキーマで解決されるように指定します。 その他すべての文に含まれる外部名は、このプロシージャが存在するスキーマで解決されます。

AUTHID DEFINER

DEFINERを指定すると、プロシージャが存在するスキーマの所有者の権限でプロシージャを実行し、プロシージャが存在するスキーマでその外部名を解決することができます。 これがデフォルトです。これによって、定義者権限プロシージャが作成されます。


参照:

実行者権限および定義者権限の詳細は、「実行者権限または定義者権限の使用(AUTHID句)」を参照してください。

body

プロシージャの必須の実行部、およびオプションでプロシージャの例外処理部。

declare_section

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

call_spec

call_specを使用すると、JavaまたはCのメソッド名、パラメータ型および戻り型を対応するSQLにマップできます。

Java_declarationでは、stringはメソッドのJava実装を示します。


参照:

  • Java_declarationのパラメータおよびセマンティクスの詳細は、『Oracle Database Java開発者ガイド』を参照してください。

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


EXTERNAL  EXTERNAL句は、Cメソッドを宣言する場合の代替方法です。 ほとんどの場合、LANGUAGE C構文を使用することをお薦めします。 ただし、デフォルト引数がパラメータの1つとして使用される場合、またはマップする必要があるPL/SQLデータ型(ブール型など)がパラメータの1つで使用される場合は、EXTERNALが必要です。 EXTERNALを使用すると、パラメータが適切に評価されるようにPL/SQLレイヤーがロードされます。

プロシージャの作成: 例 次の文は、プロシージャremove_empをスキーマhrに作成します。

CREATE PROCEDURE remove_emp (employee_id NUMBER) AS
   tot_emps NUMBER;
   BEGIN
      DELETE FROM employees
      WHERE employees.employee_id = remove_emp.employee_id;
   tot_emps := tot_emps - 1;
   END;
/

remove_empプロシージャは、指定した従業員を削除します。 このプロシージャをコールする場合は、削除する従業員のemployee_idを指定する必要があります。

このプロシージャは、DELETE文を使用して、employees表からemployee_idの行を削除します。


参照:

このプロシージャをパッケージに組み入れる方法は、「パッケージ本体の作成: 例」を参照してください。

次の例では、外部プロシージャc_find_rootはポインタをパラメータとして予測します。 プロシージャfind_rootは、BY REFERENCE句を使用して、このパラメータを参照方式で渡します。

CREATE PROCEDURE find_root
   ( x IN REAL )
   IS LANGUAGE C
      NAME c_find_root
      LIBRARY c_utils
      PARAMETERS ( x BY REFERENCE );

関連トピック


参照:

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

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