Oracle
 sql >> Baza danych >  >> RDS >> Oracle

funkcja pl/sql wywoływana ile razy?

Jest to sytuacja, w której przydatne są pewne eksperymenty (przeprowadzono je na 10g). Używając poniższego zapytania, możemy powiedzieć, że normalne funkcje, używające tych samych parametrów (w tym przypadku żadnego) będą wykonywane przy każdym wywołaniu:

select dbms_random.value() from all_tables

Dzieje się tak, ponieważ Oracle zakłada, że ​​funkcja nie zwróci konsekwentnie tej samej wartości, chyba że powiesz inaczej. Możemy to zrobić, tworząc funkcję za pomocą deterministic słowo kluczowe:

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

Używanie tej funkcji zamiast dbms_random w pierwszym zapytaniu mówi nam, że zapytanie jest wykonywane tylko raz, pomimo wielu wywołań. Ale to wyjaśnia tylko select Sekcja. Co jeśli użyjemy tej samej funkcji deterministycznej w obu select? i where klauzula. Możemy to przetestować za pomocą następującego zapytania:

SELECT rand_det
FROM   all_tables
WHERE  rand_det > .5;

Być może będziesz musiał uruchomić to kilka razy, aby zobaczyć nasz dowód, ale w końcu zobaczysz listę wartości mniejszych niż 0,5. Daje nam to dowód, że nawet funkcja deterministyczna jest wykonywana dwukrotnie:raz dla każdej sekcji, w której się pojawia. Alternatywnie, możesz zmodyfikować naszą funkcję deterministyczną w następujący sposób, a następnie uruchomić kolejne zapytanie, które pokaże 2 wiersze zapisane w 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Parametry OUT procedury składowanej Oracle

  2. Zmiana nazwy Oracle 11g. Gwarantowana atomowość?

  3. Jaka jest różnica między ORA-12571:Awaria zapisu pakietów TNS a ORA-03135:Utracono połączenie?

  4. Tworzenie tymczasowej tabeli Oracle o takiej samej strukturze tabeli jak istniejąca tabela

  5. Oracle:Czy mogę programowo stwierdzić, czy procedura zawiera zatwierdzenie?