Plsql-procedures
PL/SQL-プロシージャ
この章では、PL/SQLのプロシージャについて説明します。 *サブプログラム*は、特定のタスクを実行するプログラム単位/モジュールです。 これらのサブプログラムは結合されて、より大きなプログラムを形成します。 これは基本的に「モジュール設計」と呼ばれます。 サブプログラムは、*呼び出しプログラム*と呼ばれる別のサブプログラムまたはプログラムによって呼び出すことができます。
サブプログラムを作成することができます-
- スキーマレベルで
- パッケージ内
- PL/SQLブロック内
スキーマレベルでは、サブプログラムは*スタンドアロンサブプログラム*です。 CREATE PROCEDUREまたはCREATE FUNCTIONステートメントで作成されます。 データベースに保存され、DROP PROCEDUREまたはDROP FUNCTIONステートメントで削除できます。
パッケージ内に作成されたサブプログラムは、パッケージ化されたサブプログラム*です。 データベースに保存され、DROP PACKAGEステートメントでパッケージが削除された場合にのみ削除できます。 パッケージについては、 *'PL/SQL-パッケージ' の章で説明します。
PL/SQLサブプログラムは、一連のパラメータで起動できるPL/SQLブロックという名前です。 PL/SQLは2種類のサブプログラムを提供します-
- 関数-これらのサブプログラムは単一の値を返します。主に値を計算して返すために使用されます。
- 手順-これらのサブプログラムは値を直接返しません。主にアクションを実行するために使用されます。
この章では、* PL/SQLプロシージャ*の重要な側面について説明します。 次の章で* PL/SQL関数*について説明します。
PL/SQLサブプログラムの一部
各PL/SQLサブプログラムには名前があり、パラメータ・リストもある場合があります。 無名PL/SQLブロックのように、名前付きブロックには次の3つの部分もあります-
S.No | Parts & Description |
---|---|
1 |
Declarative Part これはオプションの部分です。 ただし、サブプログラムの宣言部はDECLAREキーワードで始まりません。 型、カーソル、定数、変数、例外、ネストされたサブプログラムの宣言が含まれています。 これらの項目はサブプログラムに対してローカルであり、サブプログラムの実行が完了すると存在しなくなります。 |
2 |
Executable Part これは必須の部分であり、指定されたアクションを実行するステートメントが含まれています。 |
3 |
Exception-handling これもオプションの部分です。 実行時エラーを処理するコードが含まれています。 |
プロシージャを作成する
プロシージャは CREATE OR REPLACE PROCEDURE ステートメントで作成されます。 CREATE OR REPLACE PROCEDUREステートメントの簡略化された構文は次のとおりです-
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter_name [IN | OUT | IN OUT] type [, ...])]
{IS | AS}
BEGIN
< procedure_body >
END procedure_name;
どこで、
- _procedure-name_は、プロシージャの名前を指定します。
- [OR REPLACE]オプションを使用すると、既存のプロシージャを変更できます。 オプションのパラメーターリストには、パラメーターの名前、モード、およびタイプが含まれます。 IN *は外部から渡される値を表し、OUTはプロシージャの外部で値を返すために使用されるパラメーターを表します。
- _procedure-body_には実行可能部分が含まれます。
- スタンドアロンプロシージャを作成するには、ISキーワードの代わりにASキーワードを使用します。
例
次の例では、文字列「Hello World!」を表示する簡単なプロシージャを作成します実行時に画面に表示されます。
CREATE OR REPLACE PROCEDURE greetings
AS
BEGIN
dbms_output.put_line('Hello World!');
END;
/
上記のコードがSQLプロンプトを使用して実行されると、次の結果が生成されます-
Procedure created.
スタンドアロンプロシージャの実行
スタンドアロンプロシージャは、2つの方法で呼び出すことができます-
EXECUTE キーワードを使用する
PL/SQLブロックからプロシージャの名前を呼び出す
*'greetings'* という名前の上記のプロシージャは、EXECUTEキーワードを指定して呼び出すことができます-
EXECUTE greetings;
上記の呼び出しは表示されます-
Hello World
PL/SQL procedure successfully completed.
プロシージャは、別のPL/SQLブロックから呼び出すこともできます-
BEGIN
greetings;
END;
/
上記の呼び出しは表示されます-
Hello World
PL/SQL procedure successfully completed.
スタンドアロンプロシージャの削除
スタンドアロンプロシージャは、 DROP PROCEDURE ステートメントで削除されます。 プロシージャを削除するための構文は-
DROP PROCEDURE procedure-name;
あなたは、次の文を使用して、グリーティングの手順をドロップすることができます-
DROP PROCEDURE greetings;
PL/SQLサブプログラムのパラメータ・モード
次の表は、PL/SQLサブプログラムのパラメータモードを示しています-
S.No | Parameter Mode & Description |
---|---|
1 |
IN INパラメーターを使用すると、サブプログラムに値を渡すことができます。 これは読み取り専用パラメーターです。 サブプログラム内では、INパラメーターは定数のように機能します。 値を割り当てることはできません。 INパラメーターとして定数、リテラル、初期化された変数、または式を渡すことができます。 デフォルト値に初期化することもできます。ただし、その場合、サブプログラム呼び出しからは省略されます。 これは、パラメーターを渡すデフォルトのモードです。 パラメーターは参照によって渡されます。 |
2 |
OUT OUTパラメーターは、呼び出し元プログラムに値を返します。 サブプログラム内では、OUTパラメーターは変数のように機能します。 値を変更し、割り当てた後に値を参照できます。 実際のパラメーターは変数でなければならず、値で渡されます。 |
3 |
IN OUT
IN OUT仮パラメータに対応する実際のパラメータは、定数または式ではなく、変数でなければなりません。 仮パラメータには値を割り当てる必要があります。 *実際のパラメーターは値で渡されます。 * |
IN&OUTモードの例1
このプログラムは、2つの値の最小値を見つけます。 ここでは、プロシージャはINモードを使用して2つの数値を取り、OUTパラメーターを使用して最小値を返します。
DECLARE
a number;
b number;
c number;
PROCEDURE findMin(x IN number, y IN number, z OUT number) IS
BEGIN
IF x < y THEN
z:= x;
ELSE
z:= y;
END IF;
END;
BEGIN
a:= 23;
b:= 45;
findMin(a, b, c);
dbms_output.put_line(' Minimum of (23, 45) : ' || c);
END;
/
上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-
Minimum of (23, 45) : 23
PL/SQL procedure successfully completed.
IN&OUTモードの例2
このプロシージャは、渡された値の値の2乗を計算します。 この例は、同じパラメーターを使用して値を受け入れ、別の結果を返す方法を示しています。
DECLARE
a number;
PROCEDURE squareNum(x IN OUT number) IS
BEGIN
x := x* x;
END;
BEGIN
a:= 23;
squareNum(a);
dbms_output.put_line(' Square of (23): ' || a);
END;
/
上記のコードがSQLプロンプトで実行されると、次の結果が生成されます-
Square of (23): 529
PL/SQL procedure successfully completed.
パラメータを渡す方法
実際のパラメータは3つの方法で渡すことができます-
- 位置表記
- 名前付き表記
- 混合表記
位置表記
位置表記法では、次のようにプロシージャを呼び出すことができます-
findMin(a, b, c, d);
位置表記では、最初の実パラメータが最初の仮パラメータに置き換えられます。 2番目の実パラメータが2番目の仮パラメータに置き換えられ、以下同様に続きます。 したがって、 a は xに、b は yに、c は z に、 d は m に置換されます。
名前付き表記
名前付き表記では、実際のパラメーターは*矢印記号(⇒)*を使用して仮パラメーターに関連付けられます。 プロシージャコールは次のようになります-
findMin(x => a, y => b, z => c, m => d);
混合表記
混合表記では、プロシージャ呼び出しで両方の表記を混在させることができます。ただし、位置表記法は名前表記法の前に置く必要があります。
次の呼び出しは合法です-
findMin(a, b, c, m => d);
ただし、これは違法です。
findMin(x => a, b, c, d);