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

Oracle SQL:Zrozumienie zachowania funkcji SYS_GUID() w widoku wbudowanym?

Dokumentacja podaje powód, dla którego możesz zobaczyć rozbieżność (podkreślenie moje):

Uwaga:

Ponieważ SQL jest językiem deklaratywnym, a nie imperatywnym (lub proceduralnym), nie możesz wiedzieć, ile razy funkcja wywołana przez instrukcję SQL zostanie uruchomiona —nawet jeśli funkcja jest napisana w PL/SQL, języku imperatywnym. Jeśli aplikacja wymaga wykonania funkcji określoną liczbę razy, nie wywołuj tej funkcji z instrukcji SQL. Zamiast tego użyj kursora.

Na przykład, jeśli aplikacja wymaga wywołania funkcji dla każdego wybranego wiersza, otwórz kursor, wybierz wiersze z kursora i wywołaj funkcję dla każdego wiersza. Ta technika gwarantuje, że liczba wywołań funkcji jest liczbą wierszy pobranych z kursora.

Zasadniczo Oracle nie określa, ile razy funkcja zostanie wywołana w instrukcji sql:może to zależeć między innymi od wydania, środowiska, ścieżki dostępu.

Istnieją jednak sposoby na ograniczenie przepisywania zapytań, jak wyjaśniono w rozdziale Rozmieszczanie zagnieżdżonych podzapytań:

Rozładowanie podzapytania powoduje rozgniecenie i scalenie treści podzapytania z treścią instrukcji, która je zawiera, umożliwiając optymalizatorowi rozważenie ich razem podczas oceny ścieżek dostępu i złączeń. Optymalizator może rozpakować większość podzapytań, z pewnymi wyjątkami . Te wyjątki obejmują podzapytania hierarchiczne i podzapytania, które zawierają pseudokolumnę ROWNUM, jeden z operatorów zestawu, zagnieżdżoną funkcję agregującą lub skorelowane odwołanie do bloku zapytania, który nie jest bezpośrednim zewnętrznym blokiem zapytania podzapytania.

Jak wyjaśniono powyżej, możesz użyć ROWNUM pseudokolumna, aby uniemożliwić Oracle rozpakowanie podzapytania:

SQL> WITH data AS (SELECT SYS_GUID() uuid FROM DUAL WHERE ROWNUM >= 1)
  2  SELECT uuid, uuid FROM data;

UUID                             UUID
-------------------------------- --------------------------------
1ADF387E847F472494A869B033C2661A 1ADF387E847F472494A869B033C2661A


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić wersję dostawcy Oracle dla ole-db. Dostawca OraOLEDB.Oracle

  2. Kodowanie i dekodowanie Base64 w Oracle

  3. Wstaw wiele rekordów w Oracle

  4. ORA-01652:nie można rozszerzyć segmentu temp o 128 w tablespace SYSTEM:Jak przedłużyć?

  5. Jak skompilować wszystkie nieprawidłowe pakiety w schemacie?