sql >> Database >  >> RDS >> Oracle

Oracle SQL:het gedrag van SYS_GUID() begrijpen wanneer aanwezig in een inline-weergave?

De documentatie geeft een reden waarom u een discrepantie ziet (nadruk van mij):

Let op:

Omdat SQL een declaratieve taal is, in plaats van een imperatieve (of procedurele) taal, u kunt niet weten hoe vaak een functie die wordt aangeroepen door een SQL-instructie zal worden uitgevoerd —zelfs als de functie is geschreven in PL/SQL, een imperatieve taal. Als uw toepassing vereist dat een functie een bepaald aantal keren wordt uitgevoerd, roep die functie dan niet op vanuit een SQL-instructie. Gebruik in plaats daarvan een cursor.

Als uw toepassing bijvoorbeeld vereist dat een functie wordt aangeroepen voor elke geselecteerde rij, opent u een cursor, selecteert u rijen van de cursor en roept u de functie voor elke rij aan. Deze techniek garandeert dat het aantal aanroepen van de functie gelijk is aan het aantal rijen dat van de cursor is opgehaald.

In principe specificeert Oracle niet hoe vaak een functie binnen een sql-statement wordt aangeroepen:het kan onder andere afhankelijk zijn van de release, de omgeving, het toegangspad.

Er zijn echter manieren om het herschrijven van query's te beperken, zoals uitgelegd in het hoofdstuk Unnesting van geneste subquery's:

Door subquery's nesten te verwijderen, wordt de hoofdtekst van de subquery samengevoegd met de hoofdtekst van de instructie die deze bevat, zodat de optimizer ze samen kan beschouwen bij het evalueren van toegangspaden en joins. De optimizer kan de meeste subquery's verwijderen, met enkele uitzonderingen . Die uitzonderingen zijn onder meer hiërarchische subquery's en subquery's die een ROWNUM-pseudokolom, een van de set-operators, een geneste aggregatiefunctie of een gecorreleerde verwijzing naar een queryblok dat niet het onmiddellijke buitenste queryblok van de subquery is, bevatten.

Zoals hierboven uitgelegd, kunt u ROWNUM . gebruiken pseudo-kolom om te voorkomen dat Oracle een subquery ongedaan maakt:

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

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


  1. Standaardwaarden van parameters parseren met PowerShell - Deel 2

  2. XML-tabel met Oracle 11g

  3. Juiste invoeging van tabelnaam

  4. Optimaliseer de prestaties van MySQL/MariaDB met de MySQLTunner-tool