PL / SQLの場合、Oracleは短絡評価を使用することを保証します。
差出人: 2 PL/SQL言語の基礎>
nextval
を使用する場合 SQLコードでは、状況が異なります。
まず、currval
およびnextval
疑似列です:
差出人:3つの疑似列 。
ここでの問題は、Oracleがnextval
を評価する理由です。 ?またはこの動作はどこかに記載されていますか?
差出人:シーケンス疑似列
あなたのケースは明らかに「1.トップレベルのSELECTステートメント」ですが、それは短絡ロジックが配置されていないことを意味するのではなく、そのnextval
だけを意味します。 常に評価されます。
短絡ロジックに関心がある場合は、nextval
を削除することをお勧めします。 方程式から。
このようなクエリはサブクエリを評価しません:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
しかし、coalesce
で同様のことをしようとすると またはcase
OracleOptimizerがサブクエリの実行を決定することがわかります。
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
SQLFiddleのこのデモ で注釈付きテストを作成しました これを表示します。
Oracleは、OR条件がある場合にのみ短絡ロジックを適用しているように見えますが、coalesce
およびcase
すべてのブランチを評価する必要があります。
PL / SQLでの最初のテストでは、coalsce
およびcase
Oracleが述べているように、PL/SQLで短絡ロジックを使用します。 SQLステートメントのシーケンスを含む2番目のテストでは、その場合はnextval
結果が使用されない場合でも、とにかく評価され、Oracleもそれを文書化します。
coalesce
であるため、2つのことを組み合わせると少し奇妙に見えます。 およびcase
私も動作に一貫性がないようですが、そのロジックの実装は実装に依存することにも留意する必要があります(ここに私のソース
)