Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Dlaczego nie możemy wykonać procedury składowanej w instrukcji select w oracle? czy jest jakiś silny powód?

Procedury nie są dozwolone w instrukcjach SQL, ponieważ mieszanie deklaratywnych i imperatywnych stylów programowania jest mylące.

Instrukcja SQL jest listą warunków — to Oracle decyduje, w jaki sposób wygenerować zestaw wyników zgodny z tymi warunkami. Procedura składowana PL/SQL to zestaw instrukcji, które zmieniają rzeczy w bardzo przewidywalny sposób.

W poniższym przykładzie ile razy należy pr być straconym? Czy jest wykonywane przed czy po id = 1? ? Gdyby instrukcje SQL miały predefiniowaną kolejność, optymalizator nie byłby w stanie wypychać predykatów, scalać podzapytań itp., a wydajność byłaby nie do zaakceptowania.

select *
from table1
where id = 1
    and pr;

Nawet jeśli procedura została użyta w select listy, to może nie mieć sensu. Na przykład select lista wewnątrz exists jest zawsze ignorowana.

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

Ale w rzeczywistości instrukcje SQL czasami muszą wchodzić w interakcje ze światem zewnętrznym i potrzebna jest pewna logika proceduralna. Funkcje są dozwolone, ponieważ zazwyczaj po prostu oblicz coś i zwróć wartość. Funkcje zwykle nie zależą od stanu programu i mają wiele skutków ubocznych. Twoje funkcje mogą używaj zmiennych sesji, aktualizuj tabele (jeśli jest ustawione na PRAGMA AUTONOMOUS TRANSACTION ), ustawić kontekst itp. Oracle nie może powstrzymać Cię od robienia tych rzeczy, ale zabronienie procedur w instrukcjach SQL przynajmniej zniechęci do takiego kodu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć powtarzające się wartości kolumn z raportu?

  2. Oracle przelicz DD-PON-RRRR na DD/MM/RRRR

  3. Udowodnienie równoważności zapytań SQL

  4. Jak usunąć rekordy na podstawie poprzednich i następnych wierszy i przypisać datę w oparciu o określone warunki?

  5. Oracle ADF na JBoss:problem z zawiniętym połączeniem Jdbc