2008/03/12

ORA-00911エラー

VBSからODBC経由でOracleへ接続。その際、ODBC経由でSQL文を投げても、

ORA-00911: 文字が無効です。

のエラーがでるばかり。

SQL文をコマンドラインから投げても通るので、SQL文自体は正しい模様。

で、試行錯誤の結果、SQLの終末端子のつもりで最後に入れていた「;」を外すとSQL文が通ることが判明。

以下、まとめ。

動的 SQL の DDL や DML にはセミコロンは不要。

※参考: 最後に入力する セミコロン(;) とスラッシュ(/) の意味

セミコロン(;)
SQL*Plus コマンドの終端文字。
単独で使用すると LIST コマンドと同じ動作になる。
SQL と SQL*Plus コマンドの終端文字はデフォルトで同一であるが SQL*Plus コマンドの終端文字は CMDSEP システム変数で変更可能。
セミコロン(;)
単一の SQL 文、 PL/SQL ステートメントの終端文字。
SQLTERMINATOR システム変数で変更可能。
スラッシュ(/)
SQL バッファの実行 兼 ブロック全体の終端文字。
PL/SQLブロック内には、文の終端文字としてセミコロンが既に使用されているため、文末と全体の終端との区別のためにある。
機能的には、RUN コマンドと似ているがスラッシュは SQL バッファを表示しないで実行する、また、RUN コマンドには終端文字として機能はないという点も異なる。
単独で使用すると SQL バッファを実行(再実行)する。
ドット(.)
ブロック全体の終端文字。
行頭で使用することで、終端文字として扱われる。(変数の終了文字としても使用する。)
ブロック要素の入力途中での間違いや入力を中断したいときに使用する(程度しか思い当たらない) (入力文字はバッファに入る)。
BLOCKTERMINATOR システム変数で変更可能。

参考URL:http://www.shift-the-oracle.com/sqlplus/command/run.html

というわけで、「;」は、決して標準SQLというわけではないようなので要注意。システム変数で変更できちゃう存在なわけだから、そりゃ標準ではないよなー。

memo
OracleのTIPSの総本山のようなところ
http://www.shift-the-oracle.com/
Oracleのエラーがでたら…。
上記サイトの[Top]→「Knowledge」→「代表的なオラクルのエラーの対処方法」
http://www.shift-the-oracle.com/oerrs/

0 件のコメント: