sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL:Förstår du beteendet hos SYS_GUID() när det finns i en inline-vy?

Dokumentationen ger en anledning till varför du kan se en diskrepans (min betoning):

Varning:

Eftersom SQL är ett deklarativt språk snarare än ett imperativt (eller procedurspråk), kan du inte veta hur många gånger en funktion som anropas av en SQL-sats kommer att köras – även om funktionen är skriven i PL/SQL, ett imperativt språk. Om din applikation kräver att en funktion körs ett visst antal gånger, anropa inte den funktionen från en SQL-sats. Använd en markör istället.

Till exempel, om din applikation kräver att en funktion anropas för varje vald rad, öppnar du en markör, väljer rader från markören och anropar funktionen för varje rad. Denna teknik garanterar att antalet anrop till funktionen är antalet rader som hämtas från markören.

I grund och botten specificerar Oracle inte hur många gånger en funktion kommer att anropas inuti en SQL-sats:det kan bero på utgåvan, miljön, åtkomstvägen bland andra faktorer.

Det finns dock sätt att begränsa omskrivning av frågor som förklaras i kapitlet Unnesting of Nested Subqueries:

Unnesting av underfråga unnstar och sammanfogar underfrågans brödtext med satsen som innehåller den, vilket gör att optimeraren kan överväga dem tillsammans när de utvärderar åtkomstvägar och kopplingar. Optimeraren kan ta bort de flesta underfrågor, med vissa undantag . Dessa undantag inkluderar hierarkiska underfrågor och underfrågor som innehåller en ROWNUM-pseudokolumn, en av uppsättningsoperatorerna, en kapslad aggregatfunktion eller en korrelerad referens till ett frågeblock som inte är det omedelbara yttre frågeblocket i underfrågan.

Som förklarat ovan kan du använda ROWNUM pseudo-kolumn för att förhindra Oracle från att avnesta en underfråga:

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

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


  1. Dynamisk SQL LOOP

  2. Hur djupkopierar jag en uppsättning data och ändrar FK-referenser till att peka på alla kopior?

  3. IGNORE_DUP_KEY långsammare på klustrade index

  4. Hur deklarerar man lokala variabler i postgresql?