1. 程式人生 > >檢視的疑惑 之 ORA-03113: 通訊通道的檔案結束

檢視的疑惑 之 ORA-03113: 通訊通道的檔案結束

近日寫一個檢視,有一點以前沒弄過的是:要根據主表A(檢視記錄數同該表記錄數)的id查詢表B中的B.yxbm,然後根據這個yxbm得到C表的yxmc。注意,A ---> B 屬於1對多。
最後要的效果是將多個yxmc組織成一個值,放入檢視(去掉重複記錄)。
資料庫是Oracle 10g .第一個版本的檢視如下(只取上面介紹的一個欄位,其他欄位省略):
create or replace view view_cgjdcx
as
select cgzb.id,cgzb.cgdh as cgdh,
(select wmsys.wm_concat(cb.bmmc||'#/##/###/#/#/#/##/#') as yxmc
from (
select temp.zbid,dept.bmmc from B temp, C dept where temp.yxbm = dept.id group by temp.zbid,dept.bmmc
) cb
where cb.zbid = cgzb.id
) as yxmc
from A cgzb

上面的程式碼在公司測試通過,興高采烈的去客戶那裡釋出,結果出人意料:用yxmc這個條件來搜尋檢視的list集合時報錯,但是卻可以查詢總記錄數。沒辦法,找原因,最後發現是sql語句執行錯誤——這樣的sql語句即使在pl/sql也執行不了(ORA-03113: 通訊通道的檔案結束)。
經過一步步的排查,發現問題在於
group by temp.zbid,dept.bmmc
。這個分組是用來去掉重複資料的,沒辦法,換一種方式
(select wmsys.wm_concat( distinct cb.bmmc||'#/##/###/#/#/#/##/#') as yxmc
from (
select temp.zbid,dept.bmmc from dzcg_cg_cb temp, eam_department dept where temp.yxbm = dept.id
) cb
where cb.zbid = cgzb.id

) as yxmc

終於可以了。

不過,不明白為什麼。網上說這種錯誤的原因很多,而這裡我想不出什麼所以然來,補丁不一致?作業系統?如果有人無意間看到我的困惑,指點下。