立即执行?

时间:2019-06-21 02:26:16

标签: oracle plsql dynamic-sql

为什么我们在PL / SQL中使用execute immediate命令?

我正在查看上一位同事编写的某些过程,我发现该人已经花了很多时间execute immediate记录过程的进展以及截断表格的过程。

我的问题是他为什么要这样做?我们不仅可以像在pl / sql proc中那样截断表吗?

2 个答案:

答案 0 :(得分:4)

Oracle不允许在可执行块内执行DDL。这是不允许的

begin
    alter table . . . 
end;

Oracle最初拥有SYS.DBMS_DDL软件包来完成此工作。但是使用起来很麻烦,因此oracle在v9左右推出了execute immediate

答案 1 :(得分:1)

除了从PL / SQL执行DDL(您已经被告知)之外,execute immediate还用于运行动态SQL 。那会是什么?创建依赖于创建PL / SQL过程时未知的信息的语句。例如,从架构中的几个表中进行选择:

SQL> set serveroutput on
SQL> declare
  2    l_str varchar2(1000);
  3    l_cnt number;
  4  begin
  5    for cur_r in (select table_name from user_tables
  6                  where table_name in ('EMP', 'DEPT', 'BONUS')
  7                 )
  8    loop
  9      l_str := 'select count(*) from ' || cur_r.table_name;
 10      execute immediate l_str into l_cnt;
 11      dbms_output.put_line(cur_r.table_name ||': '|| l_cnt);
 12    end loop;
 13  end;
 14  /
BONUS: 0
DEPT: 4
EMP: 14

PL/SQL procedure successfully completed.

SQL>

类似地,您可以创建一个动态使用表(或列)名称的函数,例如动态地使用

SQL> create or replace function f_cnt (par_table_name in varchar2)
  2    return number
  3  is
  4    l_str varchar2(1000);
  5    l_cnt number;
  6  begin
  7    l_str := 'select count(*) from ' || dbms_assert.sql_object_name(par_table_name);
  8    execute immediate l_str into l_cnt;
  9    return l_cnt;
 10  end;
 11  /

Function created.

SQL> select f_cnt('emp') from dual;

F_CNT('EMP')
------------
          14

SQL>