🙆‍♀️

【PL/SQL】ファンクション

2024/05/26に公開

以前学習したサブプログラムのファンクションについて復習メモしていきます。
プロシージャとも共通する部分が多いので、それぞれの違いについても合わせてメモしておきます。
https://zenn.dev/sudoukky/articles/761d20b3a7a1c3
https://zenn.dev/sudoukky/articles/4dbe498bd49658

ファンクションとは

ファンクションは、値を計算し処理後に結果を1つだけ戻すサブプログラムです。
簡単にいうと戻り値のあるプロシージャというイメージ。

ファンクションの構成

  • プロシージャと同じように仕様部本体から構成されています。
  • 値を実行側に戻す必要があるため、RETURN句RETURN文を記述します。
種類 書き方 概要
RETURN句 RETURN データ型; ファンクションから戻す値のデータ型を仕様部で定義する
RETURN文 RETURN (戻り値); ファンクションから戻す値を本体で定義する
基本形
// 仕様部
CREATE [OR REPLACE] FUNCTION ファンクション名[(引数 {IN | OUT | INOUT} データ型,...)]
RETURN データ型;
// 本体
IS
  宣言部
BEGIN
  処理部
  RETURN (戻り値);
EXCEPTION
  例外処理部
END ファンクション名;
// END後ろのファンクション名は、わかりやすいように明示的に記入。無くてもOK

ファンクション構成要素

  • 名前: ファンクションには一意の名前が必要です。
  • 引数: ファンクションに渡すパラメータ(引数)を定義します。引数はINOUTIN OUTのいずれかのモードで指定できます。
OUT、IN OUTが推奨されない理由について

ファンクションは「値を1つ戻す」ことが目的であり、その値はRETURN文で返します。
OUT、IN OUTを使用すると複数の値を実行側に戻すことになり、SQL文で使用できなくなるため。

  • 戻り値: ファンクションが返す値のデータ型を指定します。
  • 宣言部: ファンクション内で使用する変数を宣言します。
  • 処理部: ファンクションの実際の処理を記述します。
  • 例外処理部: エラー処理を記述します(省略可能)。

プロシージャとファンクションの使い分け

  • 戻り値
    ファンクションは常に戻り値を持ちますが、プロシージャは戻り値を持ちません。
    何かの結果を計算して返す必要がある場合はファンクションを、何かの操作を実行するだけで結果を返す必要がない場合はプロシージャを使用します。

  • パラメータ
    ファンクションはINパラメータのみを持つことができますが、プロシージャはINOUTIN OUTパラメータを持つことができます。したがって、出力パラメータが必要な場合はプロシージャを使用します。

  • SQL文
    ファンクションはSELECT文の中で使用できますが、プロシージャは使用できません。
    SQL文の一部として使用する必要がある場合はファンクションを、それ以外の場合はプロシージャを使用します。

ファンクションは`SELECT`文の中で使用できるとは?

SELECT文などのSQLクエリ内で関数を直接呼び出すことを指します。これにより、データベースからデータを取得する際に、そのデータに対して何らかの計算や変換を行うことができます。

SELECT EMPLOYEE_ID, FULL_NAME, calculate_salary(EMPLOYEE_ID) AS SALARY
FROM EMPLOYEES;

上記例では、calculate_salaryという関数がSQL文の一部として使用されています。
この関数は、各従業員の給与を計算するために使用されます。
関数をSQL文の一部として使用することで、データベースからデータを取得する際に、そのデータに対して動的な計算や変換を行うことができます。

参考

プロとしてのOracle PL/SQL入門 第3版

https://oreno-it4.info/archives/179
https://sql-oracle.com/?p=1083

Discussion