客戶資料庫升級後出現ORA-30004錯誤

yangtingkun發表於2012-01-06

幫客戶將資料庫從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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章