在begin end语句块中,先执行update 然后执行alter talbe语句报错

aivii 2010-10-16 10:48:50
在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
...全文
557 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdx0927 2010-10-17
  • 打赏
  • 举报
回复
我记得有个权限来的
aivii 2010-10-16
  • 打赏
  • 举报
回复
非常感谢gelyon,
只是为什么oralce中要这么去执行呢?出于什么考量?既然都提供了DML与DDL语句同时出现的解决办法。
为何不可直接执行呢?偏偏用要动态SQL的方式去完成呢?

另外,“Oracle规定:在块中执行DDL语句有两种方式”,哪有这样的说明,可否给个链接?本人学艺不精,望不吝赐教,感谢中!
gelyon 2010-10-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 aivii 的回复:]
抱歉,我望了输入commit;
begin
update TableName set FileldName=Value;
commit;
alter table TableName Rename column ID to ID_new;
end;
但错误是同样的。

1楼的朋友肯定是不对的,
2,3楼的朋友这样是可行,但我不明白为什么一定要用动态SQL的方式才……
[/Quote]


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


aivii 2010-10-16
  • 打赏
  • 举报
回复
抱歉,我望了输入commit;
begin
update TableName set FileldName=Value;
commit;
alter table TableName Rename column ID to ID_new;
end;
但错误是同样的。

1楼的朋友肯定是不对的,
2,3楼的朋友这样是可行,但我不明白为什么一定要用动态SQL的方式才行?
Phoenix_99 2010-10-16
  • 打赏
  • 举报
回复
begin
update t set nid = 2;
commit;
execute immediate 'alter table t rename column nid to id';
end;
gelyon 2010-10-16
  • 打赏
  • 举报
回复
DDL语句在块中要这样执行:execute immediate sql
如:execute immediate 'alter table TableName Rename column ID to ID_new';
koofield 2010-10-16
  • 打赏
  • 举报
回复
begin
update TableName set FileldName=Value;
commit;
alter table TableName Rename column ID to ID_new;
end;

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧