Function は、Procedure と違って、一つの戻り値を返す仕様になっているのでselect 構文の中でシステムで定義された関数と同様の使い方ができます。 以下の Function は、引数で与えられた値を元に、社員マスタを参照して3種類の値を select の結果として返す事になります。 1) データが存在した場合 : 氏名 2) 元の値が NULL の場合 : 該当者は存在しません 3) 対象行が存在しなかった場合 : 該当データがシステムに存在しませんselect 社員コード, 氏名, GET_CNAME(管理者) as 管理者名 from 社員マスタ自分で構築したシステム上で使う場合、特殊な計算や複数の煩雑なテーブル参照というような処理を Function で定義しておく事によって、効率が良く見通しの良いアプリケーションを作成する事ができます
CREATE OR REPLACE FUNCTION GET_CNAME ( /* 文字列引数の定義 */ PM_STRING IN VARCHAR2 ) /* 戻り値の定義 */ RETURN VARCHAR2 /**********************************************************/ /* 変数の定義 */ /**********************************************************/ AS RET_VALUE VARCHAR2(2000); WK_VALUE VARCHAR2(2000) := '初期値の設定'; /**********************************************************/ /* 処理開始 */ /**********************************************************/ BEGIN /* デバッグ表示 */ DBMS_OUTPUT.PUT_LINE( 'デバッグ:開始' ); DBMS_OUTPUT.PUT_LINE( 'デバッグ:引数:' || PM_STRING ); DBMS_OUTPUT.PUT_LINE( WK_VALUE ); /* 代入 */ RET_VALUE := PM_STRING; IF RET_VALUE is NULL THEN DBMS_OUTPUT.PUT_LINE( 'NULLデータです' ); RET_VALUE := '該当者は存在しません'; ELSE DBMS_OUTPUT.PUT_LINE( 'データ有り' ); SELECT 氏名 INTO WK_VALUE from 社員マスタ WHERE 社員コード = RET_VALUE; RET_VALUE := WK_VALUE; END IF; /* 戻り値 */ RETURN RET_VALUE; /**********************************************************/ /* 一番外側のブロックの例外処理 */ /**********************************************************/ $if 1=1 $then EXCEPTION WHEN OTHERS THEN WK_VALUE := '例外発生:'||SQLCODE||':'||SQLERRM; DBMS_OUTPUT.PUT_LINE( WK_VALUE ); RET_VALUE := '該当データがシステムに存在しません'; RETURN RET_VALUE; $end END;
SELECT INTO に対して単純に WHEN OTHERS THEN で例外処理を行っていますがこの場合は、NO_DATA_FOUND が発生しているはずです。 関連する記事 PL/SQL : Function 雛形
|
【Oracle : PL/SQLの最新記事】
- PL/SQL : 最も簡単な CSV 出力 の記述
- PL/SQL : Function と Procedure の簡単なサンプル
- Oracle : PL/SQL Function の使用方法
- Oracle : PL/SQL : 暗黙のカーソルとループブロックを使用した自動行挿入
- Oracle : PL/SQL : SELECT 〜 INTO 構文の一般的な使用方法
- Oracle : PL/SQL : カーソルを使った一般的なループ処理を行うプロシージャ
- PL/SQL : OUT タイプのパラメータを持つストアードプロシージャの処理
- PL/SQL : プロシージャの呼び出し
- PL/SQL : Function 雛形