sql >> Database >  >> RDS >> Oracle

Geneste cursor in een cursor

Normaal gesproken zou je gewoon aan de twee tafels deelnemen.

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

Omdat u zich echter zorgen maakt over efficiëntie

  • Is TEMP_TABLE echt een tijdelijke tafel? Zo ja, waarom? Het is buitengewoon zeldzaam dat Oracle tijdelijke tabellen moet gebruiken, dus dat doet me vermoeden dat u waarschijnlijk iets inefficiënts doet om de tijdelijke tabel in de eerste plaats te vullen.
  • Waarom heb je een cursor FOR lus om de gegevens van TEMP_TABLE . te verwerken ? Rij-voor-rij verwerking is de langzaamste manier om iets te doen in PL/SQL, dus het zou over het algemeen worden vermeden als u zich zorgen maakt over efficiëntie. Vanuit het oogpunt van prestaties wilt u SQL maximaliseren, zodat in plaats van een lus te maken die een reeks INSERT met één rij deed of UPDATE bewerkingen, zou u een enkele INSERT of UPDATE die een hele reeks rijen heeft gewijzigd. Als je gegevens echt in brokken moet verwerken, dan komen daar PL/SQL-verzamelingen en bulkverwerking om de hoek kijken, maar dat zal niet zo efficiënt zijn als gewone SQL.
  • Waarom heb je de DISTINCT in uw zoekopdracht tegen TEMP_TABLE ? Verwacht je echt dat er dubbele big_id . zullen zijn? waarden die niet fout zijn? Meestal gebruiken mensen DISTINCT ofwel om problemen te verdoezelen waarbij gegevens onjuist zijn samengevoegd of waarbij u Oracle dwingt een dure sortering uit te voeren voor het geval er in de toekomst onjuiste gegevens worden gemaakt wanneer een beperking de meest geschikte manier zou zijn om uzelf te beschermen.


  1. kunnen we het Unix-commando van de Oracle10g-procedure uitvoeren?

  2. Hoe accenten verwijderen in MySQL?

  3. MySQL-tabel.* ALS referentie

  4. RDS Database-opslag heeft onvoldoende ruimte