【PL/SQL】ファンクション
以前学習したサブプログラムのファンクションについて復習メモしていきます。
プロシージャとも共通する部分が多いので、それぞれの違いについても合わせてメモしておきます。
ファンクションとは
ファンクションは、値を計算し処理後に結果を1つだけ戻すサブプログラムです。
簡単にいうと戻り値のあるプロシージャというイメージ。
ファンクションの構成
- プロシージャと同じように仕様部と本体から構成されています。
- 値を実行側に戻す必要があるため、RETURN句とRETURN文を記述します。
種類 | 書き方 | 概要 |
---|---|---|
RETURN句 | RETURN データ型; | ファンクションから戻す値のデータ型を仕様部で定義する |
RETURN文 | RETURN (戻り値); | ファンクションから戻す値を本体で定義する |
// 仕様部
CREATE [OR REPLACE] FUNCTION ファンクション名[(引数 {IN | OUT | INOUT} データ型,...)]
RETURN データ型;
// 本体
IS
宣言部
BEGIN
処理部
RETURN (戻り値);
EXCEPTION
例外処理部
END ファンクション名;
// END後ろのファンクション名は、わかりやすいように明示的に記入。無くてもOK
ファンクション構成要素
- 名前: ファンクションには一意の名前が必要です。
-
引数: ファンクションに渡すパラメータ(引数)を定義します。引数は
IN
、OUT
、IN OUT
のいずれかのモードで指定できます。
OUT、IN OUTが推奨されない理由について
ファンクションは「値を1つ戻す」ことが目的であり、その値はRETURN
文で返します。
OUT、IN OUTを使用すると複数の値を実行側に戻すことになり、SQL文で使用できなくなるため。
- 戻り値: ファンクションが返す値のデータ型を指定します。
- 宣言部: ファンクション内で使用する変数を宣言します。
- 処理部: ファンクションの実際の処理を記述します。
- 例外処理部: エラー処理を記述します(省略可能)。
プロシージャとファンクションの使い分け
-
戻り値:
ファンクションは常に戻り値を持ちますが、プロシージャは戻り値を持ちません。
何かの結果を計算して返す必要がある場合はファンクションを、何かの操作を実行するだけで結果を返す必要がない場合はプロシージャを使用します。 -
パラメータ:
ファンクションはIN
パラメータのみを持つことができますが、プロシージャはIN
、OUT
、IN 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版
Discussion