3. PL/SQL ブロック

 


📝 PL/SQLブロック:匿名・プロシージャ・ファンクションの違い

今回は、PL/SQLのコードをどのように管理・実行するかについて学びます。ただのテキストとして実行するのか、それともデータベースに保存して何度も再利用するのか。その違いを理解することが、より効率的なコーディングへの第一歩です。


1. 匿名ブロックって何? ✍️

これまで私たちが書いてきたDECLARE, BEGIN, EXCEPTIONで構成されるPL/SQLのコードは、匿名ブロックと呼ばれます。

特徴説明
名前がない特定の名前がついていないため、他のコードから呼び出すことはできません。
一時的なコードコードを実行すると、その場で実行されて消えてしまいます。データベースには保存されません。
使い道ちょっとしたテストや、一度きりの作業を行うのに便利です。

匿名ブロックは、ファイルとして保存することはできますが、SQL Developerを閉じて再度開いても、データベースに自動で読み込まれることはありません。本格的なアプリケーション開発には不向きです。


2. プロシージャを使ってみよう! 🛠️

もし、同じ処理を何度も使いたい場合、そのコードに名前を付けてデータベースに保存するのが賢い方法です。その「名前付きのブロック」がプロシージャです。

2.1. プロシージャの基本

【特徴】

  • 名前がある: CREATE OR REPLACE PROCEDURE プロシージャ名で名前を付けて保存します。

  • 再利用が可能: 一度データベースに保存すれば、いつでも名前を呼び出すだけで実行できます。

  • 引数(パラメータ): 外部から値を受け取ったり、結果を返したりできます。

2.2. パラメータの3つのモード

プロシージャのパラメータには、3つのモードがあります。

モード動作例え
IN読み込み専用。プロシージャに値を渡すだけで、その値を変更することはできません。入力するだけの紙(読み取り専用)
OUT書き込み専用。プロシージャ内で値を設定し、その結果をプロシージャの外に渡します。何かを書いて渡す紙(出力専用)
INOUT読み書き両用。値を渡すことも、値を更新して結果を返すこともできます。メモを書いて返してもらう紙(入出力両用)

【注意点】 プロシージャのパラメータを宣言する際、VARCHAR2(20)のようにデータ型の長さを指定してはいけません。ただVARCHAR2NUMBERと書きます。

2.3. プロシージャの作成と呼び出し

1. プロシージャの作成 CREATE OR REPLACE PROCEDURE文を使って、プロシージャを作成します。

SQL
CREATE OR REPLACE PROCEDURE add_customer (
  c_id     IN customer.customer_id%TYPE,
  c_fname  IN customer.first_name%TYPE,
  -- 他のパラメータ...
)
AS
BEGIN
  -- 顧客テーブルにデータを挿入する処理
  INSERT INTO customer (...) VALUES (c_id, c_fname, ...);
  COMMIT;
END;
/

このコードを実行すると、ADD_CUSTOMERという名前でプロシージャがデータベースに保存されます。

2. プロシージャの呼び出し プロシージャを呼び出すには、いくつかの方法があります。

  • シンプルに呼び出す: プロシージャ名(値1, 値2, ...);

    • この方法では、パラメータの順番が重要です。

  • パラメータ名を指定して呼び出す: プロシージャ名(パラメータ名 => 値, ...);

    • =>という記号(アソシエーション演算子)を使って値を渡します。この方法では順番は関係ありません


3. ファンクション(関数)を使ってみよう! 🔢

ファンクションも、プロシージャと同じく名前付きのブロックです。

3.1. ファンクションとプロシージャの違い

ファンクションプロシージャ
戻り値必ず1つの値を返します値を返しませんOUTモードのパラメータを使って結果を渡すことはできます)。
使い方SQL文の一部として呼び出せますSQL文の一部として呼び出すことはできません。
定義方法RETURN データ型RETURN 値を記述します。RETURN文は使いません。

3.2. ファンクションの作成と呼び出し

1. ファンクションの作成 CREATE OR REPLACE FUNCTION文で作成し、必ず戻り値のデータ型を指定します。

SQL
CREATE OR REPLACE FUNCTION find_salescount (
  p_sales_date IN DATE
) RETURN NUMBER -- 戻り値のデータ型を指定
AS
  sales_count NUMBER;
BEGIN
  SELECT COUNT(1) INTO sales_count FROM sales WHERE sales_date = p_sales_date;
  RETURN sales_count; -- 戻り値を返す
END;
/

2. ファンクションの呼び出し ファンクションは、SELECT文の中で呼び出すことができます。

SQL
-- SQL文の中で呼び出す
SELECT find_salescount('01-JAN-25') FROM DUAL;

また、プロシージャと同じように、PL/SQLのコード内で変数に代入して使うこともできます。

SQL
DECLARE
  sales_count NUMBER;
BEGIN
  sales_count := find_salescount('01-JAN-25');
  DBMS_OUTPUT.PUT_LINE('売上件数: ' || sales_count);
END;
/

これで、PL/SQLブロックの3つの種類と、その違いが理解できたでしょうか。

これらの知識を活かして、より柔軟で効率的なPL/SQLコーディングに挑戦してみてください。

前の記事:2. PL/SQLでのデータ処理

次の記事:4. PL/SQL エラー処理