Oracle
 sql >> Base de données >  >> RDS >> Oracle

fonction pl/sql appelée combien de fois ?

C'est le genre de situation où certaines expérimentations sont utiles (celles-ci ont été menées sur 10g). En utilisant la requête suivante, nous pouvons dire que les fonctions normales, utilisant les mêmes paramètres (dans ce cas, aucun) seront exécutées à chaque fois qu'elles seront appelées :

select dbms_random.value() from all_tables

En effet, Oracle suppose qu'une fonction ne renverra pas la même valeur de manière cohérente, sauf si vous lui indiquez le contraire. Nous pouvons le faire en créant une fonction en utilisant le deterministic mot-clé :

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

Utiliser cette fonction au lieu de dbms_random dans la première requête nous indique que la requête n'est exécutée qu'une seule fois, malgré les nombreux appels. Mais cela ne fait que clarifier le select section. Et si nous utilisions la même fonction déterministe dans un select et un where clause. Nous pouvons tester cela en utilisant la requête suivante :

SELECT rand_det
FROM   all_tables
WHERE  rand_det > .5;

Vous devrez peut-être exécuter cela plusieurs fois pour voir notre preuve, mais, éventuellement, vous verrez une liste de valeurs inférieures à 0,5. Cela nous fournit la preuve que même la fonction déterministe est exécutée deux fois :une fois pour chaque section dans laquelle elle apparaît. Comme alternative, vous pouvez modifier notre fonction déterministe comme suit, puis exécuter la requête suivante, qui révélera 2 lignes écrites sur 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;