加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 13:51:05 所属栏目:百科 来源:网络整理
导读:create or replace procedure pris v_date date; begin select sysdate into v_date from dual; DBMS_output.put_line(v_date);end pr; SQL语句中不允许使用过程,因为混合声明性和命令式编程样式会让人感到困惑. SQL语句是一个条件列表 – 由Oracle决定如何
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语句中的过程将至少阻止此类代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读