($title_img_alt)

こちらからの投稿は、先頭に表示されているコメントへの返信になります。
EXECUTE IMMEDIATE でエラーが発生したかどうかを知る方法 T.K さん [ 4月8日(水) 10時50分 ]
現在、EXECUTE IMMEDIATE を使用して、
動的に編集した大量のSQL文を実行するプログラム(SQLRPGLE)を作成中なのですが、
この命令を実行してエラーが発生した場合に
そのエラーの内容を取得する方法がわかりません。

たとえば、
"UPDATE TBL1 SET FLDB='Y' WHERE FLDA='X'" というSQLを実行した場合で、
TBL1 に FLDA や FLDB というフィールドが存在しなかった場合、
実行時にはエラーにならず、
GET DIAGNOSTICS で SQLSTATE や SQLCODE を見てみると、
"00000" や 0 となっています。
ちなみに、正しい更新が行われた場合は、ROW_COUNT で正しい件数が取得できます。

SQL文が不正(=構文としては正しいが実行は出来ない)場合に、
結果がエラーである事や、エラーの内容を取得する方法を、
ご存知の方がいらしたらご教示願います。

なお、私のAPIの理解が不足しているのかもせれませんが、
QSQCHKS API で事前にチェック出来ないかと試したところ、
構文チェック以上の事(=SQLRPGLEでやっているプレコンパイルのような、
テーブルやフィールドの属性までチェックする事)は出来ませんでした。
RE:EXECUTE IMMEDIATE でエラーが発生したかどうかを知る方法 @445 さん [ 4月8日(水) 18時11分 ]
/FREE
PR2='UPDATE QTEMP/DUMMY SET AAA=123';
EXEC SQL EXECUTE IMMEDIATE :PR2 ; 
IF SQLCOD <> 0 ;                  
   DSPLY SQLCOD ;                 
   *INLR = *ON ;                  
ENDIF ;                           
/END-FREE
ざっくりこんな感じでAAAが存在しない場合DSPLYが表示されましたが...?。



> 現在、EXECUTE IMMEDIATE を使用して、
> 動的に編集した大量のSQL文を実行するプログラム(SQLRPGLE)を作成中なのですが、
> この命令を実行してエラーが発生した場合に
> そのエラーの内容を取得する方法がわかりません。
> 
> たとえば、
> "UPDATE TBL1 SET FLDB='Y' WHERE FLDA='X'" というSQLを実行した場合で、
> TBL1 に FLDA や FLDB というフィールドが存在しなかった場合、
> 実行時にはエラーにならず、
> GET DIAGNOSTICS で SQLSTATE や SQLCODE を見てみると、
> "00000" や 0 となっています。
> ちなみに、正しい更新が行われた場合は、ROW_COUNT で正しい件数が取得できます。
> 
> SQL文が不正(=構文としては正しいが実行は出来ない)場合に、
> 結果がエラーである事や、エラーの内容を取得する方法を、
> ご存知の方がいらしたらご教示願います。
> 
> なお、私のAPIの理解が不足しているのかもせれませんが、
> QSQCHKS API で事前にチェック出来ないかと試したところ、
> 構文チェック以上の事(=SQLRPGLEでやっているプレコンパイルのような、
> テーブルやフィールドの属性までチェックする事)は出来ませんでした。
> 
RE:EXECUTE IMMEDIATE でエラーが発生したかどうかを知る方法 T.K さん [ 4月8日(水) 18時32分 ]
@445さん
T.Kです。

ありがとうございます。当方の勘違いでした。
というのも、
GET DIAGNOSTICS :WKROWS = ROW_COUNT
のあとで SQLSTATE、SQLCODE を取得していました。
これでは GET DIAGNOSTICS の実行状況に置き換わっていますね。

皆様騒がせして申し訳ありませんでした。

> /FREE
> PR2='UPDATE QTEMP/DUMMY SET AAA=123';
> EXEC SQL EXECUTE IMMEDIATE :PR2 ; 
> IF SQLCOD <> 0 ;                  
>    DSPLY SQLCOD ;                 
>    *INLR = *ON ;                  
> ENDIF ;                           
> /END-FREE
> ざっくりこんな感じでAAAが存在しない場合DSPLYが表示されましたが...?。
> 
> 
> 
> > 現在、EXECUTE IMMEDIATE を使用して、
> > 動的に編集した大量のSQL文を実行するプログラム(SQLRPGLE)を作成中なのですが、
> > この命令を実行してエラーが発生した場合に
> > そのエラーの内容を取得する方法がわかりません。
> > 
> > たとえば、
> > "UPDATE TBL1 SET FLDB='Y' WHERE FLDA='X'" というSQLを実行した場合で、
> > TBL1 に FLDA や FLDB というフィールドが存在しなかった場合、
> > 実行時にはエラーにならず、
> > GET DIAGNOSTICS で SQLSTATE や SQLCODE を見てみると、
> > "00000" や 0 となっています。
> > ちなみに、正しい更新が行われた場合は、ROW_COUNT で正しい件数が取得できます。
> > 
> > SQL文が不正(=構文としては正しいが実行は出来ない)場合に、
> > 結果がエラーである事や、エラーの内容を取得する方法を、
> > ご存知の方がいらしたらご教示願います。
> > 
> > なお、私のAPIの理解が不足しているのかもせれませんが、
> > QSQCHKS API で事前にチェック出来ないかと試したところ、
> > 構文チェック以上の事(=SQLRPGLEでやっているプレコンパイルのような、
> > テーブルやフィールドの属性までチェックする事)は出来ませんでした。
> > 
RE:EXECUTE IMMEDIATE でエラーが発生したかどうかを知る方法 IKD さん [ 4月9日(木) 11時54分 ]
下記のRPGソースに SQLのエラーが発生したときの取得方法を解説しています。


http://www.as400-net.com/tips/dfu-query-sql/20.html

お名前

パスワード

メールアドレス

タイトル

ホームページ

アドレス

項目