0

以下のように、DB2 PL/SQL 関数でカーソルを宣言しています。

create function query1(tbname VARCHAR(32), msisdn VARCHAR(32)) 
returns VARCHAR(40) 
LANGUAGE SQL 
READS SQL DATA 
NO EXTERNAL ACTION 
DETERMINISTIC 
begin atomic 
    DECLARE vsql varchar(2000); 
    DECLARE dt_UTC   date; 
    DECLARE C1 CURSOR FOR select productid from Subscription_000 where msisdn= 123456; 
    SET vsql = 'select productid from Subscription_000 where msisdn= 123456'; 
OPEN C1; 


    return '123'; 
end 
@ 

上記の内容を k2.sql に保存しました。次のコマンドを使用してこの関数をコンパイルしようとすると、db2 -td@ -f k2.sql というエラーが表示されます。

DB21034E コマンドは有効なコマンド行プロセッサー・コマンドではなかったため、SQL ステートメントとして処理されました。SQL 処理中に返されました: SQL0104N 「DECLARE C1 CURSOR」の後に予期しないトークン「FOR」が見つかりました。予想されるトークンには次のものが含まれる場合があります: ""。行番号=10。SQLSTATE=42601

ここで何が問題なのかについての提案はありますか...?

4

1 に答える 1

2

これは難しい問題でしたが、いくつかのテストの後、問題を突き止めました: アトミックな複合ステートメント内でカーソルを宣言することはできません。BEGIN ATOMICだけに置き換えBEGINます。

で許可されているステートメントのリストを示していただければと思いますがATOMIC、マニュアルのどこかに埋もれていて、現時点では見つかりません。

(これは、DB2 のひどいエラー報告の典型的なケースです。許可されていないステートメントを認識して、それを通知できるはずではありませんか?)

編集:これは問題の 1 つですが、私が抱えていない他の問題もあるため、デバッグできません。

于 2012-09-28T08:53:21.770 に答える