sql >> Databáze >  >> RDS >> Oracle

Proč nemůžeme spustit uloženou proceduru v příkazu select v oracle? existuje nějaký pádný důvod?

V příkazech SQL nejsou povoleny procedury, protože míchání deklarativních a imperativních programovacích stylů je matoucí.

Příkaz SQL je seznam podmínek – je na společnosti Oracle, aby rozhodla, jak vytvořit sadu výsledků, která těmto podmínkám odpovídá. Uložená procedura PL/SQL je sada instrukcí, které mění věci velmi předvídatelným způsobem.

V níže uvedeném příkladu, kolikrát by měl pr být popraven? Je proveden před nebo po id = 1 ? Pokud by příkazy SQL měly předem definované pořadí, pak by optimalizátor nebyl schopen předávat predikáty, slučovat poddotazy atd. a výkon by byl nepřijatelný.

select *
from table1
where id = 1
    and pr;

I když byla procedura použita v select seznam, nemusí to dávat smysl. Například select seznam uvnitř exists je vždy ignorováno.

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

Ale ve skutečnosti SQL příkazy někdy potřebují interagovat s vnějším světem a je potřeba určitá procedurální logika. Funkce jsou povoleny, protože obvykle stačí něco vypočítat a vrátit hodnotu. Funkce obvykle nezávisí na stavu programu a mají mnoho vedlejších účinků. Vaše funkce mohly použít proměnné relace, aktualizovat tabulky (pokud je nastaveno na PRAGMA AUTONOMOUS TRANSACTION ), nastavte kontext atd. Oracle vám v těchto věcech nemůže zabránit, ale nepovolení procedur v příkazech SQL takový kód přinejmenším odradí.



  1. Syntaxe SQL pro if existuje

  2. Vyberte z tabulky, kde pole neodpovídají podmínkám

  3. otázka levého vnějšího spojení

  4. Jak provádět testy jednotek s databází h2, kde se používá bpchar?