暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

immediate execute报ora-00933错误

原创 黄宸宁 2013-08-19
1417
今天帮朋友处理一个匿名函数块报ORA-00933的问题:
declare
l_text varchar2(500) :='';
begin
for x in 74..74
loop
l_text :='alter database register logfile ''/oracle/arch/****_1_'||x||'_823260131.dbf'';';
--dbms_output.put_line(l_text);
execute immediate l_text;
end loop;
end;
/

执行该匿名存储块会报ORA-00933错误
查看该错误,发现没有任何说明
[oracle@secdb1 ~]$ oerr ora 00933
00933, 00000, "SQL command not properly ended"
// *Cause:
// *Action:

因为该匿名块不能在本地执行,所以我另外构建了一个SQL在本地测试
declare
l_text varchar2(500) :='';
begin
for x in 7..8
loop
--l_text :='alter database register logfile ''/oracle/arch/****_1_'||x||'_823260131.dbf'';';
l_text:= 'alter database ADD LOGFILE GROUP '|| x ||'('||''''||'D:\ORADATA\HCNDB\REDO0'||x||'.LOG'||''''||') SIZE 50M;' ;
dbms_output.put_line(l_text);
execute immediate l_text;
end loop;
end;
/

测试结果,错误重现,O(∩_∩)O哈!,在我机器上也会报ORA-00933错误,这是什么原因呢?
可能性一:
难道是execute immediate不能执行DDL语句?通过google发觉ddl是可以被执行的。
可能性二:
我的这条语句有问题,通过输出我要执行的语句,并单独在sqlplus下执行是正确的,说明我拼接的SQL也没问题。
经过多次测试后最终发现问题所在,原来我的
l_text:= 'alter database ADD LOGFILE GROUP '|| x ||'('||''''||'D:\ORADATA\HCNDB\REDO0'||x||'.LOG'||''''||') SIZE 50M;' ;

上面的50M后面我打了一个";",在这里其实是不用这个分号的,而也是因为这个分号,所以在验证可能性二的时候是没问题的。在取消掉分号后,上面的匿名块成功执行。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论