ラベル Oracle の投稿を表示しています。 すべての投稿を表示
ラベル Oracle の投稿を表示しています。 すべての投稿を表示

2014/10/04

Nullと空文字の扱いにハマった(Oracle vs SQL Server)

Oracle歴が長いプログラマが、SQL Serverでの開発を行った時にハマったのが、Nullと空文字("")の扱いの違いだった。

結論から言うと、以下のようになっている。
  • Oracle: 空文字 ≒ Null
  • SQL Server:空文字 ≠ Null

OracleはNullと空文字が統一に使われているが、SQL ServerではNullと空文字では違う動作する。
OracleのプロジェクトからSQL Serverのプロジェクトに変わった時に、注意が必要だ。


2014/02/22

【PL/SQL】性能改善のためのバインド変数(ホスト変数)の使い方

bind
Oracle PL/SQLを使っている現場で、動的SQLを組むときは必ずバインド変数(ホスト変数)を使用しなければならない。
※正式呼称は「バインド変数」が正しいため、以下バインド変数で統一する。

理由としては、以下に例を挙げて説明する。
/* 悪い例 */
query := query || 'SELECT A.COMPANY'
query := query || ' FROM INVOICE A'
query := query || ' WHERE A.INVOICENO = ' || '''' || lv_invoiceno || ''''
query := query || ' AND A.DATE = ' || '''' || lv_date || '''';

OPEN lcur_invoice FOR query;

この動的SQLを見ても何が悪いかわからない。
しかし、Oracleのオプティマイザは上記SQLのlv_invoicenolv_dateの中身が変わるたびに別のクエリとして認識してしまうため、キャッシュを圧迫してしまい消さなくて良いクエリが消されてしまう。

2013/11/16

【Oracle】LEFT関数、RIGHT関数の代わりにSUBSTR関数を使う

 PL/SQLを使っているときVBAの感覚で「RIGHT(lv_value, 2)」とかいたらコンパイラさんに怒られてしまった。
どうやらOracleにはVB系にあるLEFT関数やRIGHT関数は用意されていないようだ。

 LEFT関数は特に問題ないが、可変長データを扱って後ろ(右)から数文字取得したいというときにRIGHT関数が使えないのはかなり不便だ。
調べてみるとどうやらSUBSTR関数でもRIGHT関数のような書き方ができるらしい。