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语句中的过程将至少阻止此类代码.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。