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文の終了記号を付けて文を終了する必要があります。
|
参照: 前述の前提条件の詳細は、次のマニュアルを参照してください。
|
構文
create_procedure ::=

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

call_spec ::=

Java_declaration ::=

C_declaration ::=

キーワードとパラメータの説明
OR REPLACEを指定すると、プロシージャがすでに存在する場合に再作成できます。 この句を使用すると、既存のプロシージャに以前に付与されたオブジェクト権限を削除、再作成および再付与しなくても、そのプロシージャの定義を変更できます。 プロシージャを再定義すると、そのプロシージャはデータベースによって再コンパイルされます。
再定義されたプロシージャに対する権限を以前に付与されているユーザーは、権限を再付与される必要なく、プロシージャにアクセスできます。
ファンクション索引がパッケージに依存している場合は、データベースによって索引にDISABLEDのマークが付けられます。
schema
プロシージャを含めるスキーマを指定します。 schemaを省略すると、データベースによって現行のスキーマにプロシージャが作成されます。
procedure_name
作成するプロシージャの名前を指定します。
メンバー・ファンクションのAUTHIDプロパティおよびオブジェクト型のプロシージャを指定します。 AUTHIDプロパティの詳細は、「実行者権限または定義者権限の使用(AUTHID句)」を参照してください。
AUTHID CURRENT_USER
CURRENT_USERを指定すると、CURRENT_USERの権限でプロシージャを実行できます。 この句は実行者権限プロシージャを作成します。
また、この句は、問合せ、DML操作および動的SQL文の外部名がCURRENT_USERのスキーマで解決されるように指定します。 その他すべての文に含まれる外部名は、このプロシージャが存在するスキーマで解決されます。
AUTHID DEFINER
DEFINERを指定すると、プロシージャが存在するスキーマの所有者の権限でプロシージャを実行し、プロシージャが存在するスキーマでその外部名を解決することができます。 これがデフォルトです。これによって、定義者権限プロシージャが作成されます。
body
プロシージャの必須の実行部、およびオプションでプロシージャの例外処理部。
declare_section
プロシージャのオプションの宣言部。 宣言は、プロシージャに対してローカルであり、bodyで参照でき、プロシージャが実行を完了すると消滅します。
call_specを使用すると、JavaまたはCのメソッド名、パラメータ型および戻り型を対応するSQLにマップできます。
Java_declarationでは、stringはメソッドのJava実装を示します。
|
参照:
|
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 );
関連トピック
|
参照:
|