休日更新の備忘録

休日のみ更新予定の個人的備忘録置き場

【OracleDB】平成以降の元号を複数利用できるようにする

【はじめに】

ここでは、前回の続きとしてOracleDatabaseに平成以降の元号を"複数"利用できるようにします。
※ 本記事での環境は以下の通り
OS:CentOS 7
データベース:OracleDatabase 12c(12.2.0)Enterprise Edition(無償版)
検証日:2019/1/19
 ↓前回の記事はこちら↓ 
www.holiday-note.tech

【手順】

手順1 複数の新元号を定義する定義ファイル作成・適用する。

① 以下コマンドを実行し、$ORACLE_HOME/nls配下に「lxecal.nlt」ファイルを作成する。
touch $ORACLE_HOME/nls/lxecal.nlt

② 手順1-①で作成した「lxecal.nlt」ファイルに以下を記述する。
 ※ 前回追加した「改元(K)」に加え、「新元(N)」を追加する。
   値の設定方法などは前回の記事を参照。
  ↓前回の記事はこちら↓ 
www.holiday-note.tech

DEFINE calendar
    calendar_name         = "Japanese Imperial"
    DEFINE calendar_era
        era_full_name     = "b2feb8b5"
        era_abbr_name     = "4b"
        start_date        = "JAN-10-2019 AD"
        end_date          = "JAN-09-2020 AD"
    ENDDEFINE calendar_era
ENDDEFINE calendar

DEFINE calendar
    calendar_name         = "Japanese Imperial"
    DEFINE calendar_era
        era_full_name     = "bfb7b8b5"
        era_abbr_name     = "4e"
        start_date        = "JAN-10-2020 AD"
        end_date          = "DEC-31-2200 AD"
    ENDDEFINE calendar_era
ENDDEFINE calendar

③ 以下コマンドを実行し、データベースをシャットダウンする。
sqlplus / as sysdba
shutdown immediate;

④ 以下ファイルを実行し、「lxecal.nlt」をコンパイルする。
 ※ Windows環境では同じ格納先に「lxegen.exe」があるため、これを実行する。 $ORACLE_HOME/bin/lxegen
 → コマンドが正常終了すると、$ORACLE_HOME/nls配下に「lxecalji.nlb」というファイルが作成されている。

⑤ 以下コマンドを実行し、データベースをマウント・オープンする。
sqlplus / as sysdba
startup;

⑥ 以下コマンドの「sysdate」を適宜増減させ、新元号が適用されたか確認する。
select to_char(sysdate-10, 'EEYY"年"MM"月"DD"日"', 'NLS_CALENDAR = ''Japanese Imperial''') as 和暦日付 from dual;
 結果:

和暦日付  
--------------------------  
平成31年01月09日  

select to_char(sysdate-9, 'EEYY"年"MM"月"DD"日"', 'NLS_CALENDAR = ''Japanese Imperial''') as 和暦日付 from dual;
 結果:

和暦日付  
--------------------------  
改元01年01月10日  

select to_char(sysdate+355, 'EEYY"年"MM"月"DD"日"', 'NLS_CALENDAR = ''Japanese Imperial''') as 和暦日付 from dual;
 結果:

和暦日付  
--------------------------  
改元02年01月09日  

select to_char(sysdate+356, 'EEYY"年"MM"月"DD"日"', 'NLS_CALENDAR = ''Japanese Imperial''') as 和暦日付 from dual;
 結果:

和暦日付  
--------------------------  
新元01年01月10日  

【おまけ】

おまけ① 追加した元号を利用しない(元の平成までしか利用できない)ようにするには

 手順1-④で作成される「lxecalji.nlb」を削除($ORACLE_HOME/nls配下にない状態)すれば
 元に戻ります。
 shutdown等も不要でしたが、再起動した方がよさそうです。
 (適用するときもわざわざ再起動する必要はないかも?)

-- 以上 --

参考ページ
Oracle 製品における改元の影響について | NTTデータ先端技術株式会社
Oracle Database に 新しい元号(年号)「野球」を追加してみる。(NLSカレンダ・ユーティリティlxegen) - Qiita
Oracle Database の DUMP関数 と CONVERT関数 で 文字列のバイトコードを調べる。 - Qiita