🙄

【PL/SQL】プロシージャ

2024/05/19に公開

以前学習したサブプログラムのプロシージャについて復習メモしていきます。
https://zenn.dev/sudoukky/articles/761d20b3a7a1c3

プロシージャとは

データベース問合せ言語を使用してoracleデータベースにコンパイルしておき、必要なときに呼び出しができる処理のもとまりです。1つのSQL文では記述できない複雑な処理を書くことができます。

プロシージャの作成方法

基本形
// 仕様部
CREATE [OR REPLACE] PROCEDURE プロシージャ名[(引数名 {IN | OUT | INOUT} データ型,...)]
// 本体
IS
  宣言部
BEGIN
  処理部
EXCEPTION
  例外処理部
END
;

1.仕様部

  • プロシージャ名
    PROCEDUREの後に任意の名前を指定する
  • OR REPLACEオプション(省略可能)
    同名のプロシージャが既に作成されている場合、上書きして作成する。
  • パラメータの設定
    プロシージャ名の後ろに()を指定し、パラメータ名とそのパラメータのデータ型を定義できます。
パラメータの例

1.戻り値を設定する場合
プロシージャでは、直接的に戻り値をRETURNできません。代わりに、戻り値用の引数を用意し、その変数に値をセットします。
例:システム日付をYYYYMMDD形式の文字列で取得するプロシージャ

例1
CREATE OR REPLACE PROCEDURE FOOBAR(OUT_PARAM1 OUT CHAR) AS
BEGIN
    OUT_PARAM1 := TO_CHAR(SYSDATE, 'YYYYMMDD');
END;
/

2.複数の戻り値を設定する場合
例:複数の戻り値を設定するには、カンマで区切って指定します。

例2
CREATE OR REPLACE PROCEDURE FOOBAR(OUT_PARAM1 OUT CHAR, OUT_PARAM2 OUT VARCHAR2) AS
BEGIN
    OUT_PARAM1 := TO_CHAR(SYSDATE, 'YYYYMMDD');
    OUT_PARAM2 := '2つめの戻り値';
END;
/

3.引数を設定する場合
入力されたパラメータに応じて処理を行いたいときは引数が必要です。
例:YYYYMMDD形式の文字列を渡すと、その3ヶ月後の日付を返すプロシージャ

例3
CREATE OR REPLACE PROCEDURE FOOBAR(IN_PARAM1 IN CHAR, OUT_PARAM1 OUT CHAR) AS
BEGIN
    OUT_PARAM1 := TO_CHAR(ADD_MONTHS(TO_DATE(IN_PARAM1), 3), 'YYYYMMDD');
END;
/
  • IN | OUT | INOUT
    パラメータ名とデータ型の間にパラメータのモードを指定します。
モード 内容
IN 呼び出し側から値を受け取る(デフォルト)
OUT 呼び出し側に値を戻す
IN OUT 呼び出し側から値を受け取り、呼び出し側に値を戻す

2.本体
プロシージャも無名のPL/SQLブロックと同様、宣言部実行部例外処理部から構成されています。

プロシージャの実行

プロシージャの実行方法は実行形態によって異なります。
1.PL/SQLブロックからプロシージャを実行

プロシージャの実行
BEGIN
    プロシージャ名;
END;

PL/SQLブロックからプロシージャを実行する場合は、実行部に直接、プロシージャ名を指定して実行。
2.SQL*Plusからプロシージャを実行

プロシージャの実行
EXECUTE プロシージャ名

SQL*Plusからプロシージャを実行する場合は、EXECUTEコマンドを使用する。

参考

プロとしてのOracle PL/SQL入門 第3版

https://qiita.com/RAI015/items/c10d4fdf4c7fa80edbb0
https://qiita.com/nkojima/items/2f793251e4465a3a8da2

Discussion