为什么我们不能在oracle中的select语句中执行存储过程?有什么有力的理由吗?

前端之家收集整理的这篇文章主要介绍了为什么我们不能在oracle中的select语句中执行存储过程?有什么有力的理由吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
create or replace procedure pr
is
    v_date date; 
begin
    select sysdate into v_date from dual;
    DBMS_output.put_line(v_date);
end pr;
sql语句中不允许使用过程,因为混合声明性和命令式编程样式会让人感到困惑.

sql语句是一个条件列表 – 由Oracle决定如何生成与这些条件匹配的结果集. PL / sql存储过程是一组以非常可预测的方式改变事物的指令.

在下面的例子中,应该执行多少次?它是在id = 1之前还是之后执行的?如果sql语句具有预定义的顺序,那么优化器将无法推送谓词,合并子查询等,并且性能将是不可接受的.

select *
from table1
where id = 1
    and pr;

即使在选择列表中使用了一个过程,它也可能没有意义.例如,始终忽略exists中的选择列表.

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

但实际上,sql语句有时需要与外界进行交互,并且需要一些程序逻辑.允许函数,因为它们通常只是计算某些东西并返回一个值.函数通常不依赖于程序状态,并且有很多副作用.您的函数可以使用会话变量,更新表(如果它设置为PRAGMA AUTONOMOUS TRANSACTION),设置上下文等.Oracle不能阻止您执行这些操作,但禁止sql语句中的过程将至少阻止此类代码.

原文链接:https://www.f2er.com/oracle/205692.html

猜你在找的Oracle相关文章