客户数据库升级后出现ORA-30004错误

帮客户将数据库从11.2.0.1升级到11.2.0.3后,数据库运行正常,不过随后出现了ORA-30004错误。

 

 

这个错误以前还真没有碰到过,检查后发现感觉问题似乎不一定和升级有关系:

ORA-30004: when using SYS_CONNECT_BY_PATH function, cannot have separator as part of column value
Cause: A column value contained the string that the SYS_CONNECT_BY_PATH function was to use to separate column values.
Action: Specify another separator for the SYS_CONNECT_BY_PATH function to use which does not occur in any column value, then retry.

从错误信息看,是SYS_CONNECT_BY_PATH函数导致的错误。而客户出现错误的语句也确实包含SYS_CONNECT_BY_PATH函数。导致错误的原因是SYS_CONNECT_BY_PATH处理的列中包含了分隔列。

为了确认这一点,特别在11.2.0.1环境中再现这个问题:

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> create user u1 identified by u1 default tablespace users;

用户已创建。

SQL> grant connect, resource to u1;

授权成功。

SQL> conn u1/u1
已连接。
SQL> create table t_conn (id number, fid number, name varchar2(30));

表已创建。

SQL> insert into t_conn values (1, 0, 'a');

已创建 1 行。

SQL> insert into t_conn values (2, 1, 'b');

已创建 1 行。

SQL> insert into t_conn values (3, 2, 'c');

已创建 1 行。

SQL> select sys_connect_by_path(name, ',') from t_conn start with id = 1 connect by prior id = fid;

SYS_CONNECT_BY_PATH(NAME,',')
--------------------------------------------------------------------------------

,a
,a,b
,a,b,c

SQL> update t_conn set name = 'b,' where id = 2;

已更新 1 行。

SQL> commit;

提交完成。

SQL> select sys_connect_by_path(name, ',') from t_conn start with id = 1 connect
by prior id = fid;
ERROR:
ORA-30004:
使用 SYS_CONNECT_BY_PATH 函数时, 不能将分隔符作为列值的一部分

未选定行

显然确认了问题只是由于数据错误所致,而与升级没有任何关系。

根据客户错误的SQL语句,定位了表中的错误数据。将包含分隔符的数据更新后,问题消失。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-714571/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-714571/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值