【PL/SQL】ストアドプロシージャとファンクションの違いと作り方

【PL/SQL】ストアドプロシージャとファンクションの違いと作り方 PL/SQL

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におけるストアドプロシージャとファンクションは、再利用性を高めるための強力なツールです。用途や目的に応じて使い分けることで、保守性や可読性の高いコードを書くことができます。

値を返す処理ならファンクション、複雑な処理の実行ならプロシージャを選ぶのが基本です。まずは簡単な例から作ってみて、実際に使い分けてみましょう。