在升级用户系统时遇到PLS-00533错误,随查资料发现同事jxc的BLOG上有介绍;原文如下:
偶然遇到PLS-00553: 无法识别字符集名称, 关于这个问题的解决方案大都是修改数据库字符集,但是该数据库字符集没有发现明显问题,如何处理?
这个错误是发生在创建触发器时, 当触发器带 :new或者 :old关键字时报错, 如果不带就没问题. 而且该表上以前建立的触发器是好的, 但是重新编译时也会报同样的错误.
经过多次努力发现,在相同的用户/表空间下建立的表上建立的触发器是可以的. 最终判定为该表状态有问题.
最终的解决方案是, 备份该表上的触发器语法, 备份表数据, 重建表, 恢复数据, 恢复触发器, 编译失效对象.
摘自 季小川 的博客(http://blog.csdn.net/jxc/archive/2006/12/06/1432009.aspx)
因为和jxc处理的是同一个系统的同一张表,问题现象当然也完全一样;
于是首先根据jxc的方法实验之:
· 备份Trigger
· 备份表数据,利用rename实现
· 重建表,利用create as 根据备份表重新建立
· 恢复触发器,发现触发器仍然出现PLS-00553的错误
和jxc进行交流后,jxc和我的步骤相同,但当时却是成功的;随稍微改变处理方式:
· 备份Trigger
· 备份表数据,利用rename实现
· 重建表,将原表语法导出,利用SQL语句重新建立表
· 恢复触发器,成功,将Trigger全部disable
· 恢复数据
· 将trigger enable
问题得到解决;
大约过了一周,客户又提出新的需求,仍然需要进行trigger的修改,感觉非常恐怖,心想可能还要重复一周前的工作;
不料,在修改完trigger后,在生产库中直接建立(利用PLSQLDEV 的command窗口),竟然出乎意料的发现创建Trigger
成功.
重新分析原因,上次jxc是也是通过create as 建立的表,而上次我自己最后是通过sql 语句建立的表,然后用insert 插入
只有这么点区别;所以重新分析原因,因为create as 是通过数据库的copy的方式进行,所以速度非常快;而insert into 是
逻辑上面的数据插入,所以认为产生pls-00553的错误不仅和表状态相关,还与数据块的物理结构有关,重新组织数据后
问题解决.