
コンパイルエラー
思わず「はぁ?」と唸ったコンパイルエラーを紹介します。
...誰かの役にたつとは思いませんけどね。
暗黙カーソル指定時のSELECT文エラー
あるテーブルからデータを抽出するSELECT文が何故かプリコンパイルでエラーになりました。
実際のSQLはこんな感じです。
EXEC SQL
SELECT
REPLACE(NVL(FGRCD ,' '), '"' , '''' ) ,
NVL(NUMMGR , 0 )
INTO
:H-FGRCD ,
:H-NUMMGR
FROM ABCD
WHERE FGRCD = :H-IN01-FGRCD
AND NUMMGR = :H-IN01-NUMMGR
END-EXEC.
最終的にはCSVに変換する処理なので、REPLACEを使用してダブルクォートをシングルクォートに置き換えているのですが、プリコンパイラはREPLACE文が気に入らなかったようです。
ところが、まったく同じSQLを明示カーソルを使用して記述すると、エラーにならなかったりします。
思わず「はぁ?」とか呻いてしまいました。
まぁ、システム開発ではよくある事ですけどね。
解決策は、明示カーソルを使用するか、動的カーソルを使用するかの二択だったのですが、この時は動的SQLに書き換えることにしました。
なれると、動的SQLってすごく便利。
SQLコメント -- 指定時のエラー
プリコンパイルでこんなエラーが発生しました。
行337、列72でエラーが発生しました。ファイル/opt/testdir/cob/main/TEST100.pco
337 003370 SET INI = :H-INI , -- イニシャル
337 .......................................................................1
337 PCB-S-00400, 記号"-"が見つかりました。 次のうちの1つが入るとき:
( id
string REPLACE DATE COUNT EXTRACT INTERVAL TIME TIMESTAMP
TRIM AVG MAX MIN SUM STDDEV VARIANCE
しばらくは、何が何やら分らなかったのですが、落ち着いてよく見て見るとSQLのコメント「 -- イニシャル 」の -- がB領域とプログラム識別番号領域( 72列目と73列目 )に跨っていました。
プリコンパイラはこれをエラーとしたようです。
...まぁ、これは私が悪いですけどね。
素直に、1文字ずらして解決しました。
行内コメントで発生したエラー
EXEX SQL ~ END-EXEC. の間で行内コメント( *> コメント ) を使用したのですが、コンパイル時に、下記のように大量のエラーが吐き出されました。
** 診断メッセージ ** (TEST200)
JMN1123I-S 2914,2915,2916 許されない語'VARYING'が現れました.次の認識できる句,段落,節または部まで無効になります.
JMN1545I-S 2922,3098,3314,3402,3514 作業場所節中または連絡節中には,'BEGIN DECLARE SECTION'および'END DECLARE
SECTION'以外は指定できません.
JMN1278I-S 3512 BEGIN DECLARE SECTION文が指定されずに,END DECLARE SECTION文が指定されています.
JMN1576I-S 4070,4073,4076,4136,4139,4230,4235,4240,4259,4815,4874,5082,5101,5798,5851,5931,5950,6232,6284,6381,6400,
6738,6789,6797,6815,6848 このシステムでは,'SQL機能'は使用できません.
JMN2503I-S 4082 利用者語'SQLCODE'が定義されていません.
JMN2600I-S 4082 条件中のオペランドに誤りがあります.
JMN2557I-S 4082 IF文の書き方が不完全です.
JMN2510I-S 4084 対応しないEND-IFが指定されています.END-IFは,無効となります.
JMN2503I-S 6794 利用者語'SQLCA'が定義されていません.
JMN2557I-S 6794 CALL文の書き方が不完全です.
JMN2503I-S 6837 利用者語'USERNAME-LEN'が定義されていません.
JMN2557I-S 6837,6840,6843 COMPUTE文の書き方が不完全です.
JMN2503I-S 6839 利用者語'USERNAME-ARR'が定義されていません.
JMN2557I-S 6839,6842,6845 MOVE文の書き方が不完全です.
JMN2503I-S 6840 利用者語'PASSWD-LEN'が定義されていません.
JMN2503I-S 6842 利用者語'PASSWD-ARR'が定義されていません.
JMN2503I-S 6843 利用者語'DBSTRING-LEN'が定義されていません.
JMN2503I-S 6845 利用者語'DBSTRING-ARR'が定義されていません.
JMN2540I-W 6807 EXIT文を含む段落は,手続き名とEXIT文だけで構成されていなければなりません.EXIT文は,無効となります.
最大重大度コードは S で,翻訳したプログラム数は 1 本です.
ここまでエラーを吐いておいて、実際のエラー個所は下記の一行です。
000830 EXEC SQL INCLUDE TEST999.CBL END-EXEC. *> コネクト用変数
「*> コネクト用変数」を削除すると、コンパイルが通りました。
どうやら、EXEX SQL ~ END-EXEC. の範囲内では、行内コメントは使用しない方が無難なようです。
ただ、コメントを80BYTE以降に記述すると、コンパイルが通るようになりました。
いろいろ考えさせられますね。
前回:NetCOBOLで動的SQLを使ってみる
次回:NetCOBOLのサブルーチン修正でORA-01413発生
投稿記事の一覧 : http://harikofu.blog.fc2.com/blog-entry-22.html
--- blog end ---
スポンサードリンク


