JPOUG Advent Calendar 20

JPOUG Advent Calendar 2014 12/20 の記事です。

軽めの内容でちょっと一息いれてください。

Oracle Database 12cの新機能としてカラムを非表示にすることができるようになりました。

Oracle® Database新機能ガイド 12cリリース1 (12.1)
2 Oracle Database 12cリリース1 (12.1.0.1)の新機能
2.5 高可用性
2.5.5 オンライン操作
2.5.5.3 非表示の列

新機能ガイドでは「Oracleのエディションベースの再定義によって提供されるオンライン・アプリケーション移行がさらに容易になります。」と記述がありますが、(私には)ちょっとピンとこないのでもう少し具体的に考えてみましょう。

まずは非表示列を具体的に設定してみると以下のようになります。

SQL> CREATE TABLE test_tbl(
  2    id NUMBER(4) PRIMARY KEY,
  3    vc01 VARCHAR2(20),
  4    vc02 VARCHAR2(20) INVISIBLE
  5  );

表が作成されました。

SQL> describe test_tbl
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(4)
 VC01                                               VARCHAR2(20)

SQL> SELECT column_id,column_name FROM user_tab_columns
  2   WHERE table_name = 'TEST_TBL'
  3   ORDER BY column_id;

 COLUMN_ID COLUMN_NAME
---------- --------------------
         1 ID
         2 VC01
           VC02

SQL>

describeでVC02のカラム情報はでてきませんし、user_tab_columnsを検索するとVC02に対するcolumn_idがNULLとなっていることがわかります。

そこで、INSERTとSELECTを実行してみます。

SQL> INSERT INTO test_tbl VALUES(1,'test');

1行が作成されました。

SQL> INSERT INTO test_tbl VALUES(2,'test02','aaa');
INSERT INTO test_tbl VALUES(2,'test02','aaa')
            *
行1でエラーが発生しました。:
ORA-00913: 値の個数が多すぎます。


SQL> INSERT INTO test_tbl(id,vc01,vc02)VALUES(2,'test02','aaa');

1行が作成されました。

SQL> SELECT * FROM test_tbl;

        ID VC01
---------- --------------------
         1 test
         2 test02

SQL> SELECT id, vc01, vc02 FROM test_tbl;

        ID VC01                 VC02
---------- -------------------- --------------------
         1 test
         2 test02               aaa

SQL>

とまぁ、こんなところです。
要するに非表示列は明示的に指定することで操作できる列ということになります。

「ふーん。それで?」という声が聞こえてきそうですが、私は地味に良い機能だなぁと思っているのです。

お仕事の一貫で、性能劣化に対してパーティショニングを提案するような時のこと。
私:「パーティショニングを適用すると、大きな表のアクセスが早くなり…うんたらかんたら」
お客様;「どんなキーでパーティションをきれば良いかわからないんですよ」
私:「なるほど、効果的なキーがないですね。では11gをお使いなので、仮想列の機能をつかってこの日付文字列が入っているVARCHAR2列をDATE型に変換して…うんたらかんたら」
お客様:「列追加するとテストが大変なんですよ」
私:「…」
ということが往々にしてあるのです。

なぜテストが大変なのか?それはアプリケーションの中にお行儀の悪いSQLが存在する可能性があるからです。
上記の例のように、「カラム指定しないINSERT」「SELECT * FROM …」がそれにあたります。
(そういえば、とあるプロジェクトのPro*COBOLのソースはSELECT * だらけだったなぁ…(遠い目))

非表示列設定ができると、お行儀の悪いSQLがあったとしても列追加に伴う修正は不要ですよね?
もちろん、バーチャル・カラムに対しても非表示列設定は可能です。

地味だけど良い機能だと思いません?

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中