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

Indlejret markør i en markør

Normalt ville du bare slutte dig til de to borde.

FOR some_cursor IN (SELECT s.col1,
                           s.col2
                      FROM sometable s
                           JOIN temp_table t ON (s.col3 = t.col1))
LOOP
  <<do something>>
END LOOP

Da du er bekymret for effektivitet, dog

  • Er TEMP_TABLE virkelig et midlertidigt bord? Hvis ja, hvorfor? Det er overordentlig sjældent, at Oracle faktisk har brug for at bruge midlertidige tabeller, så det får mig til at mistænke, at du sandsynligvis gør noget ineffektivt for at udfylde den midlertidige tabel i første omgang.
  • Hvorfor har du en markør FOR loop for at behandle dataene fra TEMP_TABLE ? Række-for-række-behandling er den langsomste måde at gøre noget på i PL/SQL, så det ville generelt undgås, hvis du er bekymret for effektivitet. Fra et præstationssynspunkt ønsker du at maksimere SQL, så i stedet for at lave en løkke, der lavede en række af en række INSERT eller UPDATE operationer, ville du lave en enkelt INSERT eller UPDATE der ændrede et helt sæt rækker. Hvis du virkelig har brug for at behandle data i bidder, er det her, PL/SQL-samlinger og bulkbehandling vil komme til at spille, men det vil ikke være så effektivt som direkte SQL.
  • Hvorfor har du DISTINCT i din forespørgsel mod TEMP_TABLE ? Forventer du virkelig, at der vil være dublet big_id værdier, der ikke er fejlagtige? Det meste af tiden bruger folk DISTINCT forkert enten for at dække over problemer, hvor data er blevet sammenføjet forkert, eller hvor du tvinger Oracle til at udføre en dyr sortering, bare hvis der bliver oprettet forkerte data i fremtiden, når en begrænsning ville være den mere passende måde at beskytte dig selv på.


  1. Sådan returneres alle upålidelige CHECK-begrænsninger i SQL Server (T-SQL-eksempel)

  2. Markørbaserede poster i PostgreSQL

  3. Sådan fungerer SQLite Nullif()

  4. mySQL forespørgsel om gentagne begivenheder