8

最初のパラメータが評価されない場合でも、 OracleのNVL(および)関数が常に2番目のパラメータを評価する理由を誰かが知っていますか?NVL2NULL

簡単なテスト:

CREATE FUNCTION nvl_test RETURN NUMBER AS
BEGIN
  dbms_output.put_line('Called');
  RETURN 1;
END nvl_test;

SELECT NVL( 0, nvl_test ) FROM dual

を返します0が、も出力しCalledます。

nvl_test最初のパラメータがではないため、結果は無視されますが、が呼び出されNULLました。

4

4 に答える 4

8

これは常にその方法であったため、Oracleは下位互換性を維持するためにその方法を維持する必要があります。

COALESCE代わりに、短絡動作を取得するために使用してください。

于 2010-01-08T10:29:31.383 に答える
5

これは、トム・カイトがそれを確認しdecodecase短絡しているが、そのnvl理由についての正当化や文書化を行っていない投稿です。ただそれを次のように述べています:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:926029357278#14932880517348

したがって、あなたの場合は、クエリで高価な関数が呼び出されるかどうdecodeかのcase代わりに使用する必要があります。nvl

于 2010-01-07T15:59:09.610 に答える
3

一般に、2番目のパラメーターは関数を呼び出す前に評価されるのが理にかなっています。これは、一般に関数が呼び出される方法であるためです。関数へのすべての引数が評価され、評価された値が関数に送信されます。

ただし、NVLのような非常に一般的なシステム関数の場合、関数呼び出しを特殊なケースとして扱い、PL/SQLで最適化できると思いました。しかし、この最適化はOracleの開発者に行われたと確信しているので、おそらくそれは(私には)思ったよりも難しいでしょう。

于 2010-01-07T15:13:29.860 に答える
0

それらは明らかに短絡ではありませんが、Oracleのドキュメントに参照が見つかりません。

このディスカッションをチェックしてください:http://forums.oracle.com/forums/thread.jspa?messageID = 3478040

于 2010-01-07T15:13:11.357 に答える