sql >> Database >  >> RDS >> Oracle

Waarom kunnen we de opgeslagen procedure niet uitvoeren in de select-instructie in Oracle? is er een sterke reden?

Procedures zijn niet toegestaan ​​in SQL-instructies omdat het verwarrend is om declaratieve en imperatieve programmeerstijlen te combineren.

Een SQL-instructie is een lijst met voorwaarden - het is aan Oracle om te beslissen hoe de resultatenset wordt geproduceerd die aan die voorwaarden voldoet. Een PL/SQL-opgeslagen procedure is een reeks instructies die dingen op een zeer voorspelbare manier veranderen.

In het onderstaande voorbeeld, hoe vaak moet pr geëxecuteerd worden? Wordt het uitgevoerd voor of na id = 1 ? Als SQL-instructies een vooraf gedefinieerde volgorde hadden, zou de optimizer niet in staat zijn om predikaten te pushen, subquery's samen te voegen, enz., en zouden de prestaties onaanvaardbaar zijn.

select *
from table1
where id = 1
    and pr;

Zelfs als een procedure werd gebruikt in de select lijst, is het misschien niet logisch. Bijvoorbeeld de select lijst binnen een exists wordt altijd genegeerd.

select * from dual where exists (select pr from dual);

Maar in werkelijkheid hebben SQL-statements soms interactie met de buitenwereld nodig en is enige procedurele logica nodig. Functies zijn toegestaan ​​omdat ze meestal bereken gewoon iets en retourneer een waarde. Functies zijn normaal gesproken niet afhankelijk van de programmastatus en hebben veel bijwerkingen. Uw functies kunnen sessievariabelen gebruiken, tabellen bijwerken (als deze is ingesteld op PRAGMA AUTONOMOUS TRANSACTION ), een context instellen, enz. Oracle kan u er niet van weerhouden die dingen te doen, maar het weigeren van procedures in SQL-instructies zal dergelijke code in ieder geval ontmoedigen.



  1. Hoe krijg ik informatie over een door de gebruiker gedefinieerd type?

  2. Is dit een MySQL-sorteerfout?

  3. Waarom werkt dit :id in Rails niet met Postgresql maar wel met MySQL?

  4. Moet records en groepen tellen op datum op oracle db met behulp van sql-ontwikkelaar