埋め込み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(selectnameinto :namefrom sample.person whereid = 1001)
If$Get(name)'="" { // <-- SQLCODE=0以外でnameの値は保証されないWrite !,"Name = ", name
} Else {
Write !,"No such person"
}
上記の変更例(正しい使用例):
&sql(selectnameinto :namefrom sample.person whereid = 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