結論から言うと、以下のようになっている。
- Oracle: 空文字 ≒ Null
- SQL Server:空文字 ≠ Null
OracleはNullと空文字が統一に使われているが、SQL ServerではNullと空文字では違う動作する。
OracleのプロジェクトからSQL Serverのプロジェクトに変わった時に、注意が必要だ。
/* 悪い例 */
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;
lv_invoiceno
やlv_date
の中身が変わるたびに別のクエリとして認識してしまうため、キャッシュを圧迫してしまい消さなくて良いクエリが消されてしまう。