sql >> Database teknologi >  >> RDS >> Oracle

Oracle SQL:Forstår du adfærden af ​​SYS_GUID(), når den er til stede i en inline-visning?

Dokumentationen giver en begrundelse for, hvorfor du kan se en uoverensstemmelse (min fremhævelse):

Forsigtig:

Fordi SQL er et deklarativt sprog snarere end et imperativt (eller proceduremæssigt) sprog, du kan ikke vide, hvor mange gange en funktion påkaldt af en SQL-sætning vil køre -selvom funktionen er skrevet i PL/SQL, et imperativt sprog. Hvis din applikation kræver, at en funktion udføres et vist antal gange, skal du ikke starte den funktion fra en SQL-sætning. Brug en markør i stedet.

For eksempel, hvis din applikation kræver, at en funktion kaldes for hver valgt række, skal du åbne en markør, vælge rækker fra markøren og kalde funktionen for hver række. Denne teknik garanterer, at antallet af kald til funktionen er antallet af rækker, der hentes fra markøren.

Grundlæggende specificerer Oracle ikke, hvor mange gange en funktion vil blive kaldt inde i en sql-sætning:den kan blandt andet være afhængig af udgivelsen, miljøet, adgangsstien.

Der er dog måder at begrænse forespørgselsomskrivning på som forklaret i kapitlet Unnesting of Nested Subqueries:

Underforespørgsel unnesting ophæver og fusionerer underforespørgslens brødtekst i sætningen, der indeholder den, hvilket giver optimeringsværktøjet mulighed for at overveje dem sammen, når de evaluerer adgangsstier og joinforbindelser. Optimeringsværktøjet kan fjerne de fleste underforespørgsler, med nogle undtagelser . Disse undtagelser omfatter hierarkiske underforespørgsler og underforespørgsler, der indeholder en ROWNUM pseudokolonne, en af ​​sætoperatorerne, en indlejret aggregeret funktion eller en korreleret reference til en forespørgselsblok, der ikke er den umiddelbare ydre forespørgselsblok i underforespørgslen.

Som forklaret ovenfor kan du bruge ROWNUM pseudo-kolonne for at forhindre Oracle i at fjerne en underforespørgsel:

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

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


  1. Hvordan trækker man timer fra en datetime i MySQL?

  2. Tilslutning af Talend på Windows til en ODBC-database

  3. Oracle Database BLOB til InputStream i Java?

  4. Hvorfor understøtter MySQL ikke millisekund / mikrosekund præcision?