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语句中不允许使用过程,因为混合声明性和命令式编程样式会让人感到困惑.
原文链接:https://www.f2er.com/oracle/205692.htmlsql语句是一个条件列表 – 由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语句中的过程将至少阻止此类代码.