Oracle
 sql >> база данни >  >> RDS >> Oracle

Защо не можем да изпълним съхранена процедура в оператора select в oracle? има ли сериозна причина?

Процедурите не са разрешени в SQL изрази, тъй като смесването на декларативни и императивни стилове на програмиране е объркващо.

SQL изразът е списък с условия - зависи от Oracle да реши как да създаде резултатния набор, който отговаря на тези условия. PL/SQL съхранената процедура е набор от инструкции, които променят нещата по много предвидим начин.

В примера по-долу, колко пъти трябва да pr да бъде екзекутиран? Дали се изпълнява преди или след id = 1 ? Ако SQL изразите имаха предварително дефиниран ред, тогава оптимизаторът нямаше да може да изпраща предикати, да обединява подзаявки и т.н. и производителността би била неприемлива.

select *
from table1
where id = 1
    and pr;

Дори ако е използвана процедура в select списък, може да няма смисъл. Например select списък вътре в exists винаги се игнорира.

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

Но в действителност SQL изразите понякога трябва да взаимодействат с външния свят и е необходима някаква процедурна логика. Функциите са разрешени, защото обикновено просто изчислете нещо и върнете стойност. Функциите обикновено не зависят от състоянието на програмата и имат много странични ефекти. Вашите функции можеха използвайте сесийни променливи, актуализирайте таблици (ако е зададено на PRAGMA AUTONOMOUS TRANSACTION ), задайте контекст и т.н. Oracle не може да ви попречи да правите тези неща, но забраната на процедури в SQL изрази поне ще обезсърчи такъв код.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изрязване на белите интервали (нов ред и пространство на раздела) в низ в Oracle

  2. Добър инструмент за разработка и управление на база данни на Oracle в Windows

  3. Как да уловя уникална грешка на ограничение в PL/SQL блок?

  4. Има ли начин да принудим OracleCommand.BindByName да бъде истина по подразбиране за ODP.NET?

  5. Базиран на курсора тип данни на запис с курсор, връщащ множество стойности в базата данни на Oracle