用动态SQL执行删除表的过程的问题?
declare
cursor deltables is select table_name from user_tables;
tname user_tables.table_name%type;
begin
open deltables;
loop
fetch deltables into tname;
exit when deltables%notfound;
dbms_output.put_line(tname);
execute immediate 'drop table :tempname ' using tname;
end loop;
close deltables;
end;
dbms_output.put_line(tname);能输出tname的值
execute immediate 'drop table :tempname ' using tname;
这句话执行的时候出现问题
是否:tempname 不能用来作为表名的参数?
------解决方案--------------------execute immediate '... :var ' using var;格式的动态sql目的是绑定变量,采用的是类似值传递模式,一般只用于dml语句,而且只传递变量,不能传递数据库对象,连列名都不能传递,更何况ddl语句中的表名了,所以必须先构建ddl字符串,然后再执行删除
------解决方案--------------------改为这样:nvarchar(1000) @strSql;
@strSql= 'drop table ' || tname;
execute immediate @strSql;