プロが教えるわが家の防犯対策術!

aix version5 + db2 version9.5.5
の環境でUDFを作成しようとDDLを実行したところ、
以下のエラーがでて作成できませんでした。
db2 9.7 では同じDDLで作成できました。
どうやらcursorの定義に問題がありそうなのですが、
9.5では以下のcursor定義はできないものなのでしょうか?

よろしくお願いします。

--エラー内容--------------------------
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、そのコマンドが返されました。
SQL0104N "GentaniMeisai CURSOR" に続いて予期しないトークン "FOR"
が見つかりました。予期されたトークンに "<SQL_variable_condition_declaration>"
が含まれている可能性があります。 LINE NUMBER=15. SQLSTATE=42601


--DDLの中身(一部)-------------
DECLARE curGentaniMeisai CURSOR FOR
SELECT
aaa
FROM
bbb
WHERE
ccc = [変数]
;

A 回答 (2件)

エラーメッセージに


SQL0104N "GentaniMeisai CURSOR" に続いて予期しないトークン "FOR"
が見つかりました。
とあるので
カーソル名をcurGentaniMeisaiと認識していないようですね。
日本語が混ざっているとか何かおかしなコードが入っているとかしていないですか?
試してみるなら、カーソル名をc1とかにするとうまくいくとか。

9.5のマニュアル(下記URL)見てみたけど文自体は問題なさそう。
http://publib.boulder.ibm.com/infocenter/db2luw/ …

この回答への補足

回答ありがとうございます。

"GentaniMeisai CURSOR"
ここの文はエラー箇所の前20文字が表示されるみたいです。
なので途中で切れているだけで認識されていないということではなさそうです。

ちなみに
DECLARE curGentaniMeisai CURSOR;
としたらこの文自体はエラーとなりませんでした。
何かしらの条件でFORが使えないのでしょうか…。

補足日時:2012/01/16 00:16
    • good
    • 0

ANo.1です。



>"GentaniMeisai CURSOR"
>ここの文はエラー箇所の前20文字が表示されるみたいです。
失礼しました。20文字だけでしたね。(マニュアル確認しとけって言われそうですが。)

他にエラーが出ていてその影響で、FORがダメとメッセージが出ているのでない限りは、
私にはエラーになる理由が思いつかないです。

あと私に思いつくのは、念のため、FORの前に
WITHOUT HOLD

WITHOUT RETURN (もしくは他のパラメタ)
をつけてみても同じか確認してみるくらいです。
(マニュアルは、省略OKとなっているようにしか思えませんが。)

構文。最初につけたサイトからの引用。
>>-DECLARE--cursor-name--CURSOR--●--| holdability |--●---------->
>--| returnability |--●--FOR--+-select-statement-+-------------><
'-statement-name---'
holdability
.-WITHOUT HOLD-.
|--+--------------+---------------------------------------------|
'-WITH HOLD----'
returnability
.-WITHOUT RETURN-------------.
|--+----------------------------+-------------------------------|
| .-TO CALLER-. |
'-WITH RETURN--+-----------+-'
'-TO CLIENT-'

この回答への補足

解決しました。

DB2 9.5でなぜUDFではDECLARE FOR で定義できないかは分かりませんが、
FORステートメントを使って解決しました。


BEGIN ATOMIC
DECLARE fullname CHAR(40);
FOR vl AS
SELECT firstnme, midinit, lastname FROM employee
DO
SET fullname = lastname CONCAT ','
CONCAT firstnme CONCAT ' ' CONCAT midinit;
INSERT INTO tnames VALUES (fullname);
END FOR;
END

補足日時:2012/01/22 00:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!