ファンクションの作成方法
ファンクションの作成方法について説明します。
ファンクションの作成
ここではスキーマを作成のSQLを説明します。
構文は以下の通りです。
構文の詳細は公式サイトを参照ください。
【文法】
CREATE [OR REPLACE] FUNCTION ファンクション名 ([引数名 型]) RETURNS 型 LANGUAGE SQL BEGIN SQL/PL構文 END【実行例】
実際にSQLを実行しファンクション作成します。
サンプルは日付を和暦の文字列に変換する関数です。
SQLは以下の通りです。
-- 和暦の文字列を返す関数 CREATE OR REPLACE FUNCTION SF_JPN_CLDR_STR(P_DT_TERGET DATE) RETURNS VARCHAR(30) LANGUAGE SQL BEGIN -- 変数宣言 DECLARE INT_YMD INTEGER; DECLARE INT_YEAR INTEGER; DECLARE INT_JPN_YEAR INTEGER; DECLARE VC_GENGO VARCHAR(20); SET INT_YMD = TO_NUMBER(TO_CHAR(P_DT_TERGET, 'YYYYMMDD')); SET INT_YEAR = TRUNC(INT_YMD / 10000); CASE WHEN INT_YMD > 20190430 THEN SET VC_GENGO = '令和'; SET INT_JPN_YEAR = INT_YEAR - 2018; WHEN INT_YMD > 19890107 THEN SET VC_GENGO = '平成'; SET INT_JPN_YEAR = INT_YEAR - 1988; WHEN INT_YMD > 19261224 THEN SET VC_GENGO = '昭和'; SET INT_JPN_YEAR = INT_YEAR - 1925; WHEN INT_YMD > 19120729 THEN SET VC_GENGO = '大正'; SET INT_JPN_YEAR = INT_YEAR - 1911; WHEN INT_YMD > 18680124 THEN SET VC_GENGO = '明治'; SET INT_JPN_YEAR = INT_YEAR - 1911; ELSE -- 不明の場合は元号の部分に西暦の千百の位を設定 SET VC_GENGO = TO_CHAR(TRUNC(INT_YEAR / 100)); SET INT_JPN_YEAR = MOD(INT_YEAR, 100); END CASE; RETURN VC_GENGO || RIGHT(TO_CHAR(INT_JPN_YEAR, '00'), 2) || '年' || TO_CHAR(P_DT_TERGET, 'MM') || '月' || TO_CHAR(P_DT_TERGET, 'DD') || '日'; END; /
SQLの実行結果は以下の通りです。
これでファンクションが作成されました。
: (省略) 31 END CASE; 32 RETURN VC_GENGO || RIGHT(TO_CHAR(INT_JPN_YEAR, '00'), 2) || '年' 33 || TO_CHAR(P_DT_TERGET, 'MM') || '月' 34 || TO_CHAR(P_DT_TERGET, 'DD') || '日'; 35 END; 36 / DB250000I: コマンドは正常に完了しました。
ファンクションを実行してみます。
SELECT SF_JPN_CLDR_STR(CURRENT DATE) FROM SYSIBM.DUAL ;
実行結果は以下になります。ファンクションが実行され日付が和暦に変換された結果が返ってきました。
SQL> SELECT SF_JPN_CLDR_STR(CURRENT DATE) 2 FROM SYSIBM.DUAL 3 ; 1 ----------------------------------- 令和02年12月19日
ファンクションの削除
ファンクションの削除のSQLを説明します。
構文は以下の通りです。
【文法】
DROP FUNCTION ファンクション名【実行例】
実際にSQLを実行しファンクションを削除します。
SQLは以下の通りです。
DROP FUNCTION SF_JPN_CLDR_STR ;
SQLの実行結果は以下の通りです。
これでファンクションが削除されました。
SQL> DROP FUNCTION SF_JPN_CLDR_STR 2 ; DB250000I: コマンドは正常に完了しました。 SQL> SELECT ROUTINENAME, ROUTINETYPE, TEXT, ROUTINESCHEMA 2 FROM SYSCAT.ROUTINES 3 WHERE ROUTINETYPE = 'F' 4 AND ROUTINESCHEMA = 'SF_JPN_CLDR_STR' 5 ; 取り出された行はありません。