sql >> Database >  >> RDS >> Oracle

pl/sql functie hoe vaak aangeroepen?

Dit is het soort situatie waarin enig experimenteren nuttig is (dit werd uitgevoerd op 10g). Met behulp van de volgende query kunnen we zien dat normale functies, die dezelfde parameters gebruiken (in dit geval geen) elke keer dat ze worden aangeroepen, worden uitgevoerd:

select dbms_random.value() from all_tables

Dit komt omdat Oracle ervan uitgaat dat een functie niet consistent dezelfde waarde retourneert, tenzij u het anders vertelt. We kunnen dat doen door een functie te maken met behulp van de deterministic zoekwoord:

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

Deze functie gebruiken in plaats van dbms_random in de eerste query vertelt ons dat de query maar één keer wordt uitgevoerd, ondanks de vele oproepen. Maar dit verduidelijkt alleen de select sectie. Wat als we dezelfde deterministische functie gebruiken in zowel een select en een where clausule. We kunnen dat testen met de volgende query:

SELECT rand_det
FROM   all_tables
WHERE  rand_det > .5;

Mogelijk moet u dit meerdere keren uitvoeren om ons bewijs te zien, maar uiteindelijk ziet u een lijst met waarden kleiner dan 0,5. Dit geeft ons het bewijs dat zelfs de deterministische functie twee keer wordt uitgevoerd:één keer voor elke sectie waarin deze voorkomt. Als alternatief kunt u onze deterministische functie als volgt wijzigen en vervolgens de volgende query uitvoeren, die 2 regels onthult die zijn geschreven naar 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. begrijp json_agg niet in deze context

  2. Mysql-fout:zoekopdracht was leeg

  3. Top PG Clustering High Availability-oplossingen voor PostgreSQL

  4. Hoe MySQL te installeren met phpMyAdmin op Debian 7