sql >> Databasteknik >  >> RDS >> Oracle

pl/sql-funktion anropad hur många gånger?

Det här är den typen av situation där vissa experiment är användbara (detta utfördes på 10g). Med hjälp av följande fråga kan vi se att normala funktioner som använder samma parametrar (i detta fall ingen) kommer att exekveras varje gång de anropas:

select dbms_random.value() from all_tables

Detta beror på att Oracle antar att en funktion inte kommer att returnera samma värde konsekvent om du inte säger något annat. Vi kan göra det genom att skapa en funktion med deterministic nyckelord:

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

Använder denna funktion istället för dbms_random i den första frågan berättar att frågan körs endast en gång, trots många anrop. Men detta förtydligar bara select sektion. Vad händer om vi använder samma deterministiska funktion i både en select och en where klausul. Vi kan testa det med följande fråga:

SELECT rand_det
FROM   all_tables
WHERE  rand_det > .5;

Du kan behöva köra detta flera gånger för att se vårt bevis, men så småningom kommer du att se en lista med värden som är mindre än 0,5. Detta ger oss bevis på att även den deterministiska funktionen exekveras två gånger:en gång för varje sektion den förekommer i. Som ett alternativ kan du modifiera vår deterministiska funktion enligt följande och sedan köra den efterföljande frågan, som kommer att avslöja 2 rader skrivna till 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. MariaDB RTRIM() vs RTRIM_ORACLE():Vad är skillnaden?

  2. Omvänd sträng ord för ord med SQL

  3. MySQL 5.6 - tabell låser även när ALGORITHM=inplace används

  4. Koordinatjämförelse i databas