« 美術にぶるっ! | トップページ | マヤ歴終了と人類滅亡 »

2012年12月16日 (日)

DB2 コマンド行プロセッサーのオプション

DB2のプロシージャを作っていて、「?」と思った事象があったので、メモ。

まあ仕様なんですが、ちょっと、はまった。。

例えば、以下のようなプロシージャをメモ帳なんかで作成し、「C:\sum.sql」なんて名前で保存します。

CREATE OR REPLACE PROCEDURE sum( IN  p_a INTEGER
                    , IN  p_b INTEGER
                    , OUT p_s INTEGER) 
LANGUAGE SQL 
BEGIN 
    SET p_s = p_a + p_b; 
END
@

で、作ったプロシージャをDB2のコマンド行プロセッサーでコンパイルします。

C:\Program Files\IBM\SQLLIB\BIN>db2 -td@ -f C:\sum.sql
DB20000I  SQL コマンドが正常に完了しました。

まあ普通ですね。

「-td@」は、末尾の「@」を、ステートメントの終了文字として扱うという意味です。

なんか、サンプルが「@」を使っていたので、お作法と思って使ってましたし、特に困ってもいなかったんですが。。。

ある日のこと、プロシージャを修正する必要に駆られて、修正しました。

CREATE OR REPLACE PROCEDURE sum( IN  p_a INTEGER
                    , IN  p_b INTEGER
                    , OUT p_s INTEGER) 
LANGUAGE SQL 
BEGIN 
    SET p_s = p_a + p_b;    --方法
END
@

コメントを入れただけです。。。で、コンパイルっと。

C:\Program Files\IBM\SQLLIB\BIN>db2 -td@ -f C:\sum.sql
DB21034E  コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
SQL0104N  "SET p_s = p_a + p_b;" に続いて予期しないトークン "END-OF-STATEMENT"
が見つかりました。予期されたトークンに "END" が含まれている可能性があります。
LINE NUMBER=6.  SQLSTATE=42601

DB21034E  コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
SQL0104N  "END" に続いて予期しないトークン "END-OF-STATEMENT"
が見つかりました。予期されたトークンに "JOIN 

" が含まれている可能性があります。  SQLSTATE=42601 C:\Program Files\IBM\SQLLIB\BIN>

なんですと!

コメントをいれたのが駄目だったのか?いろいろ実験する。

CREATE OR REPLACE PROCEDURE sum( IN  p_a INTEGER
                    , IN  p_b INTEGER
                    , OUT p_s INTEGER) 
LANGUAGE SQL 
BEGIN 
    SET p_s = p_a + p_b;    --コメント
END
@

↑これはOK。

CREATE OR REPLACE PROCEDURE sum( IN  p_a INTEGER
                    , IN  p_b INTEGER
                    , OUT p_s INTEGER) 
LANGUAGE SQL 
BEGIN 
    --方法
    SET p_s = p_a + p_b;
END
@

↑これもOK。

CREATE OR REPLACE PROCEDURE sum( IN  p_a INTEGER
                    , IN  p_b INTEGER
                    , OUT p_s INTEGER) 
LANGUAGE SQL 
BEGIN 
    SET p_s = p_a        --コメント
            + p_b;
END
@

↑これもOK。

CREATE OR REPLACE PROCEDURE sum( IN  p_a INTEGER
                    , IN  p_b INTEGER
                    , OUT p_s INTEGER) 
LANGUAGE SQL 
BEGIN 
    SET p_s = p_a        --方法
            + p_b;
END
@

↑これはNG。

どうも、SQL文が含まれれる行に、「方法」というコメントが入るとNGのようです。

なんで??としばし悩んだが、「法」の文字コードを見ると納得。

「法」はShift-JISで「96H」+「40H」。

「@」は、「40H」ということで、ステートメントの終了文字として見なされていたようです。

「40H」で終わる漢字は、

「拭」「繊」「叩」「邸」「如」「鼻」「法」「諭」「蓮」

等。この中で、コメント末尾に来そうなモノは、「法」位か。。。上手いこと踏んだもんだ。

コーディング規約で、「末尾が『法』となるコメントは使用禁止」?それはさすがにナンセンス。

マニュアルを見ると、「-tdxx」というように、2文字までの指定が可能らしい。

そこで、

CREATE OR REPLACE PROCEDURE sum( IN  p_a INTEGER
                    , IN  p_b INTEGER
                    , OUT p_s INTEGER) 
LANGUAGE SQL 
BEGIN 
    SET p_s = p_a + p_b;    --方法
END
@@

で、

C:\Program Files\IBM\SQLLIB\BIN>db2 -td@@ -f C:\sum.sql
DB20000I  SQL コマンドが正常に完了しました。

おおっ。できた。

DB2使いの皆さんは、どんな終了文字を指定しているんだろ?

|

« 美術にぶるっ! | トップページ | マヤ歴終了と人類滅亡 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/538346/56332081

この記事へのトラックバック一覧です: DB2 コマンド行プロセッサーのオプション:

« 美術にぶるっ! | トップページ | マヤ歴終了と人類滅亡 »