次のようなステートメントを実行すると、
select first field1, field2 from exampleTable where field1 = '1';
その後、次のような警告が表示されます。
返される結果は非決定的なSQLCode = 122です。
これまでのところ問題はありません。この場合、ここに「order by」句が必要だからです。
しかし、BEGIN ENDブロック内で同じステートメントを使用して、値をいくつかの宣言された変数に入れると、
BEGIN
declare varField1 varchar;
declare varField2 varchar;
select first field1, field2 into varField1, varField2
from exampleTable
where field1 = '1';
END
警告は出ません!どうして?
ここで「order by」句は必要ありませんか?このステートメントは突然確定的ですか?...
(SQL Anywhere 12を使用)
SQLでは行は特定の順序で返されないため(実際にはほとんどの場合同じ順序になる可能性が高い)、ORDER BYを使用しないと、最初に行が返される可能性があります。したがって、この最初のレコードはクエリを実行するたびに変わる可能性があるため、非決定的です。
ブロックでそれを包むことは答えを確定的ではなく、単に警告を隠すだけです。
呼び出し間で変更される可能性があるデータのため、ベーステーブルからの選択ステートメントはすべて非決定的であると思います。