如何在执行立即语句中使用游标变量更改表

时间:2013-11-17 13:17:40

标签: sql oracle plsql alter

我在PS服务器上有7个表,他们拥有过去3年的数据(数十亿条记录)。要求是将所有数据移动到备份表,除了上个月的数据。所以我们接近:

  • 1)将现有表名更改为备份表
  • 2)然后创建新表
  • 3)然后将3个月的数据移至新表格。

这样数据处理速度很快。

我尝试使用以下查询来更改表名但它没有用。任何人都可以帮忙。这是当务之急。

declare 
 sql_stmt varchar2(1000); 
 cursor c1 is select table_name from staging_clear; 
 type t1 is table of c1%rowtype; 
 curtype t1;
 begin 
 open c1; 
 fetch c1 bulk collect into curtype;  
 for i in 1..curtype.count loop  
 sql_stmt:= 'begin 
          alter table  '||curtype(i).table_name||' rename to '|| curtype(i).table_name||'_bkp';
          dbms_output.put_line(sql_stmt);
   execute immediate sql_stmt; 
   dbms_output.put_line(sql_stmt); 
  end loop;  
 end;

错误报告:

  

ORA-06550:第2行第11列:PLS-00103:遇到符号   " ALTER"当期待以下之一时:begin case declare exit   for goto if loop mod null pragma raise返回选择更新时使用      << close current delete fetch lock insert open rollback   savepoint set sql execute commit forall merge pipe ORA-06512:at line   13   06550. 00000 - "行%s,列%s:\ n%s"   *原因:通常是PL / SQL编译错误。

1 个答案:

答案 0 :(得分:0)

声明被破坏了:只需写下“ALTER TABLE'并忘掉了“开始”

sql_stmt:= 'alter table  '||curtype(i).table_name||' rename to '|| curtype(i).table_name||'_bkp';