VB6とoo4o(Oracle Objects for OLE)の組み合わせで構築された、とあるシステムの改修前調査をしていたところ、SQLの実行時に「ORA-01756: 単一引用符が閉じられていません。」というエラーが発生しました。
その時に調べたことと対処です。
まず、Oracleのエラーの内容的から、下記のようにSQLの構文ミスで文字列リテラルのシングルクォーテーションの閉じ忘れやエスケープの間違いなのかなと考えました。
INSERT INTO テーブル(項目1, 項目2) VALUES(‘foo’, ‘bar);
しかし、デバッグ用にSQLを取得してみると、閉じ忘れやエスケープの問題はないように見え、SQL*Plusでも正常に処理が行えます。
SQLを詳細に調べてみると、下記のように文字列リテラルの中にNULL文字(文字コード0x00の文字。赤で強調した部分)が含まれており、このSQLが実行されるとOracleはリテラルが閉じられていないとしてORA-01756が発生させるようです。
プログラムは、プリペアドステートメントやパラメータクエリなどを使用する実装ではなく、SQLを動的に生成する実装であったため、データ中にNULL文字が含まれていると実行エラーが回避することができません。
そこで、SQLを生成するルーチンにNULL文字列が出現した場合、空白に置き換えるロジックを追加しました。
これにより、ORA-01756は発生しなくなり問題なくSQLが実行できようになりました。
SQL = Replace(SQL, Chr(0), “ “)
Please give us your valuable comment