コメントを記述する際の注意事項
今回紹介するのは、コメントをどう書いたらわかりやすくなるかというコメントを記述する際の注意事項ではなくこんなコメントを記述するとコンパイルエラーとかで動かなくなるよ。っていうOracleの仕様の部分を説明(自分用のめも)するので、興味のない場合はブラウザバック推奨です。
注意事項としては、以下の4つを今回紹介します。
- コメントの挿入場所の注意事項
- 終了記号の後にコメントを記述
- コメントの中に終了文字を記述
- コメントの中に「&」アンパサンドを記述
コメントの挿入場所の注意事項
SQL*Pluには事前にSQLとPL/SQLを解析するという機能がないためコメントの挿入場所によって予期しない動きをしてしまいます。
論より証拠ということでPL/SQLの定義作成で確認してみましょう。
--動くPL/SQL定義 CREATE OR REPLACE PROCEDURE TEST_PROCEDURE IS var1 VARCHAR2(10) := 'HelloWorld'; BEGIN DBMS_OUTPUT.PUT_LINE( var1 ); EXCEPTION WHEN OTHERS THEN NULL; END TEST_PROCEDURE; / --動かないPL/SQL定義 CREATE OR REPLACE /* コメント */ PROCEDURE TEST_PROCEDURE IS var1 VARCHAR2(10) := 'HelloWorld'; BEGIN DBMS_OUTPUT.PUT_LINE( var1 ); EXCEPTION WHEN OTHERS THEN NULL; END TEST_PROCEDURE; /
SQL> CREATE OR REPLACE 2 PROCEDURE TEST_PROCEDURE 3 IS 4 var1 VARCHAR2(10) := 'HelloWorld'; 5 BEGIN 6 DBMS_OUTPUT.PUT_LINE( var1 ); 7 EXCEPTION 8 WHEN OTHERS THEN 9 NULL; 10 END TEST_PROCEDURE; 11 / プロシージャが作成されました。
はい\(^o^)/上のPL/SQLはちゃんと動作してますね。ここで2行目にコメントを入れてみましょう。
SQL> CREATE OR REPLACE 2 /* コメント */ 3 PROCEDURE TEST_PROCEDURE 4 IS 5 var1 VARCHAR2(10) := 'HelloWorld'; 警告: プロシージャが作成されましたが、コンパイル・エラーがあります。 SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE( var1 ); 3 EXCEPTION 4 WHEN OTHERS THEN 5 NULL; 6 END TEST_PROCEDURE; 7 / DBMS_OUTPUT.PUT_LINE( var1 ); * 行2でエラーが発生しました。: ORA-06550: 行2、列24: PLS-00201: 識別子VAR1を宣言してください。 ORA-06550: 行2、列2: PL/SQL: Statement ignored
2行目にコメントを入れただけで動かなくなってしまいました。
これは始めの「/」が文の終了記号と認識されてしまうために予期せぬ動作になっているようです。コメントの位置を変更して対応しましょう。
終了記号の後にコメントを記述
終了記号(ピリオド、セミコロンまたはスラッシュ)の後にコメントを書くとエラーが発生します。
SQL> SELECT SYSDATE FROM DUAL; -- コメント 2 ; SELECT SYSDATE FROM DUAL; -- コメント * 行1でエラーが発生しました。: ORA-00911: 文字が無効です。
コメントの中に終了文字を記述
コメントの中に終了文字を記述するとそこでSQLが終了とみなされてしまうので思ったとおりに動作しません。
SELECT SYSDATE -- コメント; FROM DUAL;
SQL> SELECT SYSDATE 2 -- コメント; -- コメント * 行2でエラーが発生しました。: ORA-00923: FROMキーワードが指定の位置にありません。 SQL> FROM DUAL; SP2-0042: 不明なコマンドです("FROM DUAL")。行の残りは無視されました。
コメントの中に「&」アンパサンドを記述
「&」は、置換変数とみなされてしまいます。コメントの中に「&」を書かないようにしましょう\(^o^)/
SQL> SELECT SYSDATE 2 -- &コメント 3 FROM DUAL; コメントに値を入力してください:
コメント