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

用动态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;