在学习动态SQL的时候,接触到了“execute immediate”,然后通过它实现了动态建表。今天本来想在存储过程中删除表中数据,于是再次使用到了“execute immediate”,使用如下:
- SQL code
create or replace procedure pro_trunc istablename 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 6ORA-06512: 在 line 1
谢谢!
------解决方案--------------------
不可以这样写的,对于execute immediate直接执行时,传入的参数不可以是列名,表名
如果你分两步是可以的
例,下面这样写是可以的:
- SQL code
create or replace procedure pro_trunc istablename 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;