これは 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)'="" {
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 の後でのみ有効性が保証されます。