📝 PL/SQLブロック:匿名・プロシージャ・ファンクションの違い
今回は、PL/SQLのコードをどのように管理・実行するかについて学びます。ただのテキストとして実行するのか、それともデータベースに保存して何度も再利用するのか。その違いを理解することが、より効率的なコーディングへの第一歩です。
1. 匿名ブロックって何? ✍️
これまで私たちが書いてきたDECLARE, BEGIN, EXCEPTIONで構成されるPL/SQLのコードは、匿名ブロックと呼ばれます。
匿名ブロックは、ファイルとして保存することはできますが、SQL Developerを閉じて再度開いても、データベースに自動で読み込まれることはありません。本格的なアプリケーション開発には不向きです。
2. プロシージャを使ってみよう! 🛠️
もし、同じ処理を何度も使いたい場合、そのコードに名前を付けてデータベースに保存するのが賢い方法です。その「名前付きのブロック」がプロシージャです。
2.1. プロシージャの基本
【特徴】
名前がある:
CREATE OR REPLACE PROCEDURE プロシージャ名で名前を付けて保存します。再利用が可能: 一度データベースに保存すれば、いつでも名前を呼び出すだけで実行できます。
引数(パラメータ): 外部から値を受け取ったり、結果を返したりできます。
2.2. パラメータの3つのモード
プロシージャのパラメータには、3つのモードがあります。
【注意点】
プロシージャのパラメータを宣言する際、VARCHAR2(20)のようにデータ型の長さを指定してはいけません。ただVARCHAR2やNUMBERと書きます。
2.3. プロシージャの作成と呼び出し
1. プロシージャの作成
CREATE OR REPLACE PROCEDURE文を使って、プロシージャを作成します。
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. ファンクションとプロシージャの違い
3.2. ファンクションの作成と呼び出し
1. ファンクションの作成
CREATE OR REPLACE FUNCTION文で作成し、必ず戻り値のデータ型を指定します。
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文の中で呼び出す
SELECT find_salescount('01-JAN-25') FROM DUAL;
また、プロシージャと同じように、PL/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コーディングに挑戦してみてください。
