sql >> データベース >  >> RDS >> Oracle

pl / sql関数は何回呼び出されましたか?

    これは、いくつかの実験が役立つような状況です(これは10gで実施されました)。次のクエリを使用すると、同じパラメータ(この場合はなし)を使用する通常の関数が呼び出されるたびに実行されることがわかります。

    select dbms_random.value() from all_tables
    

    これは、特に指定しない限り、関数が一貫して同じ値を返すことはないとOracleが想定しているためです。 deterministicを使用して関数を作成することでそれを行うことができます キーワード:

    CREATE FUNCTION rand_det
       RETURN NUMBER
       DETERMINISTIC AS
    BEGIN
       RETURN DBMS_RANDOM.VALUE ();
    END;
    

    dbms_randomの代わりにこの関数を使用する 最初のクエリでは、呼び出しが多いにもかかわらず、クエリが1回だけ実行されていることがわかります。ただし、これは selectを明確にするだけです。 セクション。 selectの両方で同じ決定論的関数を使用するとどうなりますか およびwhere 句。次のクエリを使用してテストできます:

    SELECT rand_det
    FROM   all_tables
    WHERE  rand_det > .5;
    

    証明を確認するには、これを数回実行する必要があるかもしれませんが、最終的には、0.5未満の値のリストが表示されます。これにより、決定論的関数でさえ2回実行されているという証拠が得られます。セクションごとに1回ずつ実行されます。別の方法として、決定論的関数を次のように変更してから、後続のクエリを実行すると、<に書き込まれた2行が表示されます。 code> DBMS_OUTPUT 。

    CREATE OR REPLACE FUNCTION rand_det
       RETURN NUMBER
       DETERMINISTIC AS
    BEGIN
       DBMS_OUTPUT.put_line ('Called!');
       RETURN DBMS_RANDOM.VALUE ();
    END;
    
    SELECT rand_det
    FROM   all_tables;
    


    1. Railsの移行でデータをあるテーブルから別のテーブルに移動するにはどうすればよいですか?

    2. データベースにフィールド値として0が格納されている場合でも、Djangoクエリセットオブジェクトは0ではなくNoneを返します

    3. mysql/oracleに保存された数式

    4. 開発スナップショットのテーブルの一部のみのPostgresダンプ