OracleのPL/SQLを活用する際に、避けて通れないのが「ストアドプロシージャ(Procedure)」と「ファンクション(Function)」です。どちらも処理をカプセル化して再利用できる便利な仕組みですが、その目的や使い方には明確な違いがあります。この記事では、それぞれの違いと具体的な作成方法について、初心者にもわかりやすく解説します。
ストアドプロシージャとファンクションの違いとは?
まずは、両者の主な違いを一覧で比較してみましょう。
項目 | ストアドプロシージャ | ファンクション |
---|---|---|
戻り値 | なし(OUTパラメータは可) | 必ず戻り値あり |
呼び出し方法 | PL/SQLからCALL可能 | SQL文内で利用可能 |
主な用途 | 一連の処理を実行 | 値の計算や変換処理 |
DML操作 | 制限なし | 基本的にSELECTのみ推奨 |
簡単に言えば、プロシージャは処理の実行が主目的で、ファンクションは値を返すことが主目的という違いがあります。
ストアドプロシージャの作り方
まずはストアドプロシージャの基本的な構文を見てみましょう。
CREATE OR REPLACE PROCEDURE proc_hello(p_name IN VARCHAR2) AS
BEGIN
DBMS_OUTPUT.PUT_LINE('こんにちは、' || p_name || 'さん');
END;
このプロシージャは、名前を引数として受け取り、DBMS_OUTPUT.PUT_LINE
でメッセージを表示する簡単な例です。
呼び出し方
BEGIN
proc_hello('佐藤');
END;
このように、プロシージャはBEGIN~END
ブロック内から呼び出します。
ファンクションの作り方
次に、ファンクションの基本構文を紹介します。
CREATE OR REPLACE FUNCTION func_add(p_a IN NUMBER, p_b IN NUMBER)
RETURN NUMBER AS
BEGIN
RETURN p_a + p_b;
END;
このファンクションは、2つの数値を受け取り、その合計を返すシンプルな内容です。
呼び出し方
ファンクションはSQL文内でも利用可能です。
SELECT func_add(10, 20) AS result FROM dual;
または、PL/SQL内で以下のように代入して使うこともできます。
DECLARE
v_sum NUMBER;
BEGIN
v_sum := func_add(5, 7);
DBMS_OUTPUT.PUT_LINE('合計は:' || v_sum);
END;
使用上の注意点
ファンクションはSQL文内で使用できる便利な存在ですが、DML(INSERT、UPDATE、DELETEなど)を実行しない方が良いとされています。SQL文内で副作用を引き起こす可能性があるためです。
一方で、プロシージャはDML操作に適しており、業務処理の自動化やバッチ処理に向いています。
まとめ
PL/SQLにおけるストアドプロシージャとファンクションは、再利用性を高めるための強力なツールです。用途や目的に応じて使い分けることで、保守性や可読性の高いコードを書くことができます。
値を返す処理ならファンクション、複雑な処理の実行ならプロシージャを選ぶのが基本です。まずは簡単な例から作ってみて、実際に使い分けてみましょう。