CREATE PROCEDURE ステートメント (PL/SQL)

CREATE PROCEDURE ステートメントは、データベースに保管されるプロシージャーを定義します。

呼び出し方法

このステートメントは、 コマンド行プロセッサー (CLP)、サポートされる対話式 SQL インターフェース、アプリケーション、またはルーチンから実行できます。

許可

ステートメントの許可 ID によって保持される特権には、少なくとも以下のいずれか 1 つが含まれていなければなりません。
  • プロシージャーのスキーマ名がない場合は、データベースに対する IMPLICIT_SCHEMA 権限
  • プロシージャーのスキーマ名が既存のスキーマを参照する場合は、スキーマに対する CREATEIN 特権
  • DBADM 権限
ステートメントの許可 ID によって保持される特権には、プロシージャー本体で指定される SQL ステートメントの呼び出しに必要なすべての特権も含まれていなければなりません。

OR REPLACE が指定されている場合は、ステートメントの許可 ID は、対応するプロシージャーの所有者でなければなりません (SQLSTATE 42501)。

構文

構文図を読む構文図をスキップするCREATEOR REPLACE PROCEDURE(,parameter-nameINOUTIN OUTdata-typedefault-clause)READS SQL DATAISASdeclarationBEGINstatement EXCEPTIONWHENexceptionORexceptionTHENstatementENDprocedure-name

説明

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;