CREATE PROCEDURE ステートメント (PL/SQL)
CREATE PROCEDURE ステートメントは、データベースに保管されるプロシージャーを定義します。
呼び出し方法
このステートメントは、 コマンド行プロセッサー (CLP)、サポートされる対話式 SQL インターフェース、アプリケーション、またはルーチンから実行できます。
許可
ステートメントの許可 ID によって保持される特権には、少なくとも以下のいずれか 1 つが含まれていなければなりません。
- プロシージャーのスキーマ名がない場合は、データベースに対する IMPLICIT_SCHEMA 権限
- プロシージャーのスキーマ名が既存のスキーマを参照する場合は、スキーマに対する CREATEIN 特権
- DBADM 権限
OR REPLACE が指定されている場合は、ステートメントの許可 ID は、対応するプロシージャーの所有者でなければなりません (SQLSTATE 42501)。
構文
説明
- PROCEDURE procedure-name
- プロシージャーの識別名を指定します。 procedure-name の非修飾書式は、最大長が 128 の SQL ID です。 動的 SQL ステートメントでは、CURRENT SCHEMA 特殊レジスターの値を使用して、非修飾オブジェクト名を修飾します。
静的 SQL ステートメントでは、QUALIFIER プリコンパイルまたはバインド・オプションが、非修飾オブジェクト名の修飾子を暗黙に指定します。 procedure-name の修飾書式は、スキーマ名の後にピリオド文字と SQL ID が続きます。 2 部構成の名前を指定する場合は、スキーマ名の先頭を「SYS」にすることはできません。この文字を先頭にすると、エラーが戻されます (SQLSTATE 42939)。
名前 (暗黙修飾子または明示修飾子を含む) とパラメーターの数の組み合わせによって、カタログに記述されているプロシージャーを識別することはできません (SQLSTATE 42723)。 非修飾名とパラメーターの数を組み合わせて使用すると、そのスキーマ内で固有になりますが、スキーマ間で固有にする必要はありません。
- parameter-name
- パラメーターの名前を指定します。 パラメーター名は、このプロシージャーにとって固有でなければなりません (SQLSTATE 42734)。
- data-type
- サポートされる PL/SQL データ・タイプの 1 つを指定します。
- READS SQL DATA
- SQL データを変更しない SQL ステートメントを、プロシージャーに含められることを示します。 この節は、 データ・サーバーの拡張機能です。
- IS または AS
- プロシージャー本体の定義の開始を示します。
- declaration
- 1 つ以上の変数、カーソル、または REF CURSOR 型宣言を指定します。
- BEGIN
- 実行可能ブロックの開始を示します。 BEGIN-END ブロックに EXCEPTION セクションを含めることができます。
- statement
- PL/SQL または SQL ステートメントを指定します。 ステートメントの末尾は、セミコロンでなければなりません。
- EXCEPTION
- 例外セクションの開始を示す、オプションのキーワード。
- WHEN exception-condition
- 1 つ以上のタイプの例外に関してテストする条件式を指定します。
- statement
- PL/SQL または SQL ステートメントを指定します。 ステートメントの末尾は、セミコロンでなければなりません。
- END
- ブロックを終了する必須のキーワード。 オプションで、プロシージャーの名前を指定できます。
注
CREATE PROCEDURE ステートメントを難読化形式でサブミットできます。 難読化されたステートメントでは、プロシージャー名のみを判読できます。 ステートメントの他の部分は判読できないようにエンコードされますが、データベース・サーバーはその部分をデコードできます。 難読化ステートメントの作成は、DBMS_DDL.WRAP 関数を呼び出すことによって行えます。
例
以下の例は、パラメーターがない単純なプロシージャーを示しています。
CREATE OR REPLACE PROCEDURE simple_procedure
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('That''s all folks!');
END simple_procedure;次の例では、IN および OUT パラメーターを持ち、ラベルが標準 PL/SQL 形式 (
<<label>>) の GOTO ステートメントを持つプロシージャーを示します。
CREATE OR REPLACE PROCEDURE test_goto
( p1 IN INTEGER, out1 OUT VARCHAR2(30) )
IS
BEGIN
<<LABEL2ABOVE>>
IF p1 = 1 THEN
out1 := out1 || 'one';
GOTO LABEL1BELOW;
END IF;
if out1 IS NULL THEN
out1 := out1 || 'two';
GOTO LABEL2ABOVE;
END IF;
out1 := out1 || 'three';
<<LABEL1BELOW>>
out1 := out1 || 'four';
END test_goto;