SQL文は実行前に必ず解析され、構文規則に従っているか、有効なデータベース・オブジェクトを参照しているかが検証されます。エラーが検出されると、SQLCA変数sqlca.sqlerrd[4]
にオフセットが格納されます。これは明示的にチェックできます。このオフセットには、解析エラーの始まりを示すSQL文中の文字位置が示されています。通常のC言語の文字列と同様に、先頭の文字位置は0(ゼロ)です。たとえば、オフセットが9のとき、解析エラーは10番目の文字から始まっています。
解析エラー・オフセットは、準備と解析が別々に実行される状況で使用されます。その代表例は動的SQL文です。
解析エラーは、キーワードの欠落、キーワードの位置指定の誤り、キーワードのスペルミス、無効なオプションなどが原因で発生します。次に、動的SQL文の例を示します。
"UPDATE emp SET jib = :job_title WHERE empno = :emp_number"
これは解析エラーになります。
ORA-00904: invalid column name
原因は、列名JOBのスペルミスです。sqlca.sqlerrd[4]
の値は15になりますが、これは誤った列名JIBが16番目の文字で始まっているためです。
SQL文に解析エラーがなければ、Oracleではsqlca.sqlerrd[4]
が0(ゼロ)に設定されます。解析エラーが先頭の文字(文字位置は0(ゼロ))で始まっているときも、sqlca.sqlerrd[4]
は0(ゼロ)に設定されます。このため、sqlca.sqlerrd[4]
のチェックは、sqlca.sqlcodeが負の値(エラーが発生したことを示す)の場合にのみ行ってください。