記事
· 3 hr 前 2m read

埋め込みSQL &SQL( select xxx into :var from ... ) としたとき、出力ホスト変数varに意図しない値が格納される場合があります

これは InterSystems FAQ サイトの記事です。

埋め込みSQLの出力ホスト変数は、SQLCODE=0(埋め込みSQL正常終了)の場合のみ、正しい値が設定されていることが保証されます。

InterSystems製品のバージョンによっては、SQLCODEが0以外の場合(該当データがない100やエラー等)で値が設定される場合もありますが、その値は無効です。

特に、IRIS2021.1以降のバージョンでは、SQLCODE=100 の場合、INTO 節で指定された出力ホスト変数は NULL("") にクリアされますので注意が必要です。

Cacheや、IRIS2020.x 以前のバージョンでは、明示的な値のクリアを行っておりませんでしたが、こちらについても値は保証されるものではありません。

埋め込みSQLを使用する場合は、必ずSQLCODEを確認してエラーチェックを行うようにして下さい。
また、エラーチェック以外でも、SQLCODE = 0(データあり) の場合と SQLCODE = 100(データなし) の場合は処理を分けるようにし、SQLCODE = 100 の場合は出力ホスト変数を参照しないようご注意ください。


例)
誤った使用例:

  &sql( select name into :name from sample.person where id = 1001 )
  If $Get(name)'="" { // <-- SQLCODE=0以外でnameの値は保証されない
      Write !,"Name = ", name
  } Else {
      Write !,"No such person"
  }



上記の変更例(正しい使用例):

  &sql( select name into :name from sample.person where id = 1001 )
  If SQLCODE=0 {
      Write !,"Name = ", name
  } ElseIf SQLCODE=100 {
      Write !,"No such person"
  } Else {
      Write !,"SQL ERROR: ",SQLCODE
  }


以下ドキュメントをご参照ください。
埋め込みSQLのホスト変数について【IRIS】
埋め込みSQLのホスト変数について


ホスト変数の値には以下のような制限事項があります。

  • 入力ホスト変数は、埋め込み SQL で変更されることはありません。 
  • 出力ホスト変数は、SQLCODE = 0 のときに埋め込み SQL の後でのみ有効性が保証されます。 
ディスカッション (0)0
続けるにはログインするか新規登録を行ってください