「ORA-01756: 単一引用符が閉じられていません。」が発生した時の対処

日曜日 , 30, 7月 2023 Leave a comment

VB6とoo4o(Oracle Objects for OLE)の組み合わせで構築された、とあるシステムの改修前調査をしていたところ、SQLの実行時に「ORA-01756: 単一引用符が閉じられていません。」というエラーが発生しました。

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), “ “)
Tags:, ,

Please give us your valuable comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください