【PL/SQL】無名ブロック・プロシージャ・ファンクション

2020年9月21日

霊夢
霊夢

今日は、タイトル通り、

「無名ブロック」・「プロシージャ」・「ファンクション」

について説明するわよ。準備はできた?

準備OKだぜ。霊夢!

魔理沙
魔理沙

無名ブロック

霊夢
霊夢

まず最初に、
SQLを発行する方法で
BEGIN NULL; END;
を発行してみて。

ん!?
SQLを発行する場所で良いの?

魔理沙
魔理沙
霊夢
霊夢

そうよ。
魔理沙が使ってるのは「SQL*Plus」だったかしら?
半角スペースとセミコロン(;)を忘れないでね。

あっ!
エラーもなく実行できたぜ。
SQLでもない感じだし、なんなんだこれ?

魔理沙
魔理沙

実はこれ、PL/SQLなのよ。

まじか!
説明しろよ!

魔理沙
魔理沙
霊夢
霊夢

BEGIN と END; で囲まれた部分はPL/SQLの「実行部」って呼ばれるてるの。
部の詳しくは「PL/SQL入門【第6回 例外処理のはなし】」の「補足 PL/SQLのブロック構造」を見てね。
何も処理を書かないってのはできないから、「NULL;」を書いたのよ。
改行をいれたコードを下に載せとくわね。

BEGIN
    NULL;
END;

うおっ!
ホントだ!プログラムだぜ。

魔理沙
魔理沙
霊夢
霊夢

変数は使ってないから、「宣言部」を省略してるのよ。
「宣言部」も記述したら
DECLARE BEGIN NULL; END;
ってなるわ。
改行を入れたコードも載せとくわね。

DECLARE
BEGIN
    NULL;
END;

うおっ!
ホントだ!プログラムだぜ。

魔理沙
魔理沙
霊夢
霊夢

じゃあ、「NULL;」ではなく、
何か処理を書いてみましょうか。
説明するのによく「DBMS_OUTPUT.PUT_LINE」が使われるけど
最初からこれだとわかりづらいから、INSERT文でいきましょうか!
変数も宣言してみようね。
テーブルはテスト用に適当に作ってね。
コードを下に載せるわね。

DECLARE
    L_A NUMBER := 1;
BEGIN
    INSERT INTO TSTBL(A, B) VALUES (L_A, 'BBB');
 
    COMMIT;
END;
霊夢
霊夢

しばらく同じ顔で疲れたから表情替えるね。
じゃあ、ソースの説明をするよ。
「L_A」って変数を宣言して、数値の「1」を入れてるよ。
テーブルの「A」項目に変数値を、「B」項目に文字列の「’BBB’」を設定しているわ。
で、最後に「COMMIT」ね。
※本番でコーディングする時は、EXCEPTION(例外処理)を記述してROLLBACKもしようね

霊夢
霊夢

最初と同じでSQLを発行する方法と同じやり方で実行してみてね。
実はこれ、Javaとかで「INSERT文」、「UPDATE文」を発行している箇所にこのまま書いても実行できるのよ!

うおー。
ほんとに実行できた!
科学の力ってすげーっ!

魔理沙
魔理沙
霊夢
霊夢

(科学の力ではないんだけど・・・喜んでるから、まっ、良いか・・)
実行する部分(ブロック)に名前がないから「無名ブロック」なのよ。
活用してね!

プロシージャ

霊夢
霊夢

プロシージャは、PL/SQL入門【第4回 処理を書いてみよう】
を参照してね♪
ブロックに名前を付けてオラクル上にコンパイルしたものよ。

うわ~。
手、抜いてきたな~~~。
次いこうぜ。

魔理沙
魔理沙

ファンクション

霊夢
霊夢

ファンクションは、〇〇〇を参照してね♪
じゃ、さすがに悪いから
おもしろい使い方を教えるわね。
ちなみにファンクションは実行部から戻り値を戻すわよ。

は~や~く
教えてくれ~。

魔理沙
魔理沙
霊夢
霊夢

(ありゃ!手抜きし過ぎて、テンションかなり下がってるわね)
じゃあ、下にコードを載せるわね。
コンパイルしてね。

FUNCTION GET_NO(IN_VAL IN NUMBER) RETURN NUMBER IS
    L_RETV NUMBER := 0;
BEGIN
    IF IN_VAL <> 0 THEN
        L_RETV := IN_VAL / 2;
    END IF;
 
    RETURN(L_RETV);
END GET_NO;
霊夢
霊夢

ファンクションに数値を渡すと、2で除算して
その結果を返します。
普通はプロシージャとかから呼び出すけど・・・。

霊夢
霊夢

なんと、SQLのSELECTとかに埋め込んで呼び出す事ができるんです!
SELECT GET_NO(6) FROM DUAL
みたいにね。もちろん、引数はテーブルの項目も渡せるわよ。

霊夢
霊夢

上のSQLの結果は、「3」が返ってくるわよ!

うおー!
すげー!
「3」が返ってきた!
科学の力ってすげー!

魔理沙
魔理沙
霊夢
霊夢

(うーん。科学の力ではないんだけどね。。。)
そうね。すごいよね。喜んでくれて私もうれしいわ。
INSERTとか、UPDATEにも埋め込めるわよ。

すげーすげーすげー
科学の力ってすげー!

魔理沙
魔理沙
霊夢
霊夢

魔理沙がバグったみたいだから
今日はこのへんにするわね。
またね~。

記事を読む >> Oracle PL/SQL入門【第1回 まずはコンパイルまで】

【PL/SQL】メニュー

サイトマップ

2020年9月21日Oracle,PL/SQL,SQL,データベース,プログラムPL/SQL入門

Posted by こっぷ