時代は野球や!彡(゚)(゚) Oracle Database の NLSカレンダ・ユーティリティで
新しい元号(年号)「野球」を追加してみるやで。マニュアルは下記の通り。
Oracle Databaseグローバリゼーション・サポート・ガイド
12cリリース1 (12.1) B71319-05
12 ロケール・データのカスタマイズ
NLSカレンダ・ユーティリティを使用したカレンダのカスタマイズ
http://docs.oracle.com/cd/E57425_01/121/NLSPG/ch13custlocale.htm#BABIBFBAOracle Databaseは、複数のカレンダをサポートしています。
場合によっては、その中に、今後の元号の追加が必要なものや、
地域的な要件に合せて、うるう年の日数の増減が必要なものがあります。
まずはサンプルの定義ファイルを見てみるやで。マニュアルは下記の通り。
http://docs.oracle.com/cd/E57425_01/121/NLSPG/ch13custlocale.htm#BABIBFBA
テキスト定義ファイルの名前とlxegenユーティリティに対する位置は、プラットフォーム依存の値でハードコード化されています。
UNIXプラットフォームの場合、ファイル名はlxecal.nltで、$ORACLE_HOME/nlsディレクトリにあります。
テキスト定義ファイルのサンプルは、$ORACLE_HOME/nls/demoディレクトリに含まれています。
デモ・ファイルのインストール方法の詳細は、『Oracle Database Examplesインストレーション・ガイド』』を参照してください。
Oracle Database Examples Linux x86-64版 の ダウンロード は 下記から。
※下記のリンクは 2017/1/12時点のものです。
Oracle Database 12c Release 1 Examples (12.1.0.2.0) for Linux x86-64
http://www.oracle.com/technetwork/database/enterprise-edition/downloads/database12c-linux-download-2240591.html?ssSourceSiteId=otnjp
Oracle Database Examplesをダウンロードしてインストールすると、
$ORACLE_HOME/nls/demo配下にサンプルの定義ファイルが展開されます。下記は サンプルlxecal.nlt の抜粋。
-- ***************************************************************************
-- Here is an example on defining Emperors for a Imperial Calendar
-- ***************************************************************************
--
-- DEFINE calendar
--
-- calendar_name = "Japanese Imperial"
--
-- DEFINE calendar_era
-- era_full_name = bebccfc2
-- era_abbr_name = 53
-- start_date = "DEC-25-1926 AD"
-- end_date = "jAN-07-1989 AD"
-- ENDDEFINE calendar_era
--
-- DEFINE calendar_era
-- era_full_name = cabfc0ae
-- era_abbr_name = 48
-- start_date = "JAN-08-1989 AD"
-- end_date = "DEC-31-2099 AD"
-- ENDDEFINE calendar_era
--
-- ENDDEFINE calendar
--
「bebccfc2」はEUC文字コードで「昭和」、「cabfc0ae」は「平成」に対応します。
SQL> select CONVERT(CHR(TO_NUMBER('bebccfc2', 'xxxxxxxx')), 'AL32UTF8', 'JA16EUC') from dual;
CONVERT(CHR(TO_NUMBE
--------------------
昭和
SQL> select CONVERT(CHR(TO_NUMBER('cabfc0ae', 'xxxxxxxx')), 'AL32UTF8', 'JA16EUC') from dual;
CONVERT(CHR(TO_NUMBE
--------------------
平成
「野球」に対応するEUC文字コードは「cceeb5e5」なので、
こいつを lxecal.nlt に記述して、$ORACLE_HOME/nls配下に配置します。
$ pwd
/u01/app/oracle/product/12.1.0/dbhome_1/nls
$ ls -la lxecal.nlt
-rw-r--r-- 1 oracle oinstall 301 Jan 12 11:50 lxecal.nlt
$ cat lxecal.nlt
DEFINE calendar
calendar_name = "Japanese Imperial"
DEFINE calendar_era
era_full_name = "cceeb5e5"
era_abbr_name = "59"
start_date = "JAN-01-2019 AD"
end_date = "DEC-31-2200 AD"
ENDDEFINE calendar_era
ENDDEFINE calendar
「lxegen」コマンドを起動すると、「lxecal.nlt」がコンパイルされて
「lxecalji.nlb」と云うバイナリファイルが作成されます。
$ lxegen
NLS Calendar Utility: Version 12.1.0.2.0 - Production
Copyright (c) Oracle 1994, 2014. All rights reserved.
CORE 12.1.0.2.0 Beta
$ ls -la lxecal*
-rw-r--r-- 1 oracle oinstall 301 Jan 12 11:50 lxecal.nlt
-rw-r--r-- 1 oracle oinstall 144 Jan 12 14:20 lxecalji.nlb ←コイツ
$
いよいよやで…DBをシャットダウン/再起動して、2019年1月1日を取得してみると……
SQL> SHUTDOWN IMMEDIATE;
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> STARTUP
ORACLEインスタンスが起動しました。
Total System Global Area 2399141888 bytes
Fixed Size 2927192 bytes
Variable Size 654312872 bytes
Database Buffers 1728053248 bytes
Redo Buffers 13848576 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL> ALTER SESSION SET NLS_CALENDAR="Japanese Imperial";
セッションが変更されました。
SQL> SELECT SYSDATE+719 FROM DUAL;
SYSDATE+719
---------------------------------------------
野球01年01月01日
SQL>
野球元年や!彡(゚)(゚)
人気の投稿
- Oracle Database に 新しい元号(年号)「野球」を追加してみる。(NLSカレンダ・ユーティリティlxegen)
- 2/23(火) の JPOUG Tech Talk Night #6 で Oracle Database の オプティマイザ統計運用 について語ってきたやで。
- iostat の await, svctm の 見かた、考え方(※10/30スライド修正)
- Oracle Database の NLS_CALENDAR に "Japanese Imperial" を指定して元号を出す。
- Oracle Database 12c で OPTIMIZER_DYNAMIC_SAMPLING=11 をセットすると、Dynamic Sampling の 結果 が RESULT CAHCE に格納されて、異なるSQL で 共有される。