在begin end语句块中,先执行update 然后执行alter talbe语句报错
如下:
begin
  update TableName set FileldName=Value;                      
  alter table TableName Rename column ID to ID_new;   
end;错误如下:
第 3 行出现错误:
ORA-06550: 第 3 行, 第 1 列:
PLS-00103: 出现符号 "ALTER"在需要下列之一时:
begin case declare end
exception exit for goto if loop mod null pragma raise return
select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe

解决方案 »

  1.   

    begin
      update TableName set FileldName=Value;   
      commit;
      alter table TableName Rename column ID to ID_new;   
    end;
      

  2.   

    DDL语句在块中要这样执行:execute immediate sql
    如:execute immediate 'alter table TableName Rename column ID to ID_new';
      

  3.   

    begin
    update t set nid = 2;
    commit;
    execute immediate 'alter table t rename column nid to id';
    end;
      

  4.   

    抱歉,我望了输入commit;
    begin
      update TableName set FileldName=Value;   
      commit;
      alter table TableName Rename column ID to ID_new;   
    end;
    但错误是同样的。1楼的朋友肯定是不对的,
    2,3楼的朋友这样是可行,但我不明白为什么一定要用动态SQL的方式才行?
      

  5.   

    Oracle规定:在块中执行DDL语句有两种方式
    一种是:execute immediate 'sql';
    另一种是:dbms_utility.exec_ddl_statement('sql');
      

  6.   

    非常感谢gelyon,
    只是为什么oralce中要这么去执行呢?出于什么考量?既然都提供了DML与DDL语句同时出现的解决办法。
    为何不可直接执行呢?偏偏用要动态SQL的方式去完成呢?另外,“Oracle规定:在块中执行DDL语句有两种方式”,哪有这样的说明,可否给个链接?本人学艺不精,望不吝赐教,感谢中!