为什么我们在PL / SQL中使用execute immediate
命令?
我正在查看上一位同事编写的某些过程,我发现该人已经花了很多时间execute immediate
记录过程的进展以及截断表格的过程。
我的问题是他为什么要这样做?我们不仅可以像在pl / sql proc中那样截断表吗?
答案 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>