日期:2014-05-17  浏览次数:21154 次

execute immediate使用遇到的问题
在学习动态SQL的时候,接触到了“execute immediate”,然后通过它实现了动态建表。今天本来想在存储过程中删除表中数据,于是再次使用到了“execute immediate”,使用如下:
SQL code

create or replace procedure pro_trunc is
tablename varchar(15) :='URGE_T';
begin
  --execute immediate 'truncate table '||tablename;
  --execute immediate 'truncate table urge_t';
  execute immediate  'truncate table :1' using tablename;
  execute immediate  'truncate table :1' using 'urge_t';
end pro_trunc;


注释的两句话可以执行,但是没注释的不可以。本来以为是在取表名的时候需要使用大写,于是把tablename字符串代表的表名写成大写,但是结果还是不行,下面是执行情况和错误提示:
SQL code

SQL> exec pro_trunc;

begin pro_trunc; end;

ORA-00903: 表名无效
ORA-06512: 在 "QIUYUE.PRO_TRUNC", line 6
ORA-06512: 在 line 1


谢谢!


------解决方案--------------------
不可以这样写的,对于execute immediate直接执行时,传入的参数不可以是列名,表名

如果你分两步是可以的

例,下面这样写是可以的:
SQL code

create or replace procedure pro_trunc is
tablename varchar2(15) := 'urge_t';
p_val varchar2(1000);
begin
    execute immediate  'select ''truncate table ''||:1
         from dual '
        into p_val 
        using tablename;
    execute immediate p_val;
end pro_trunc;
/
exec pro_trunc;