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 );
関連トピック
参照:
|