将listAgg改为XMLAGG 后报错ORA-00932 :excepted char got clob
本来原来使用listAgg,但是报错:result of string concatenation is too long,错误是由于oracle对字符串长度有限制,长度不能超过4000.超过4000以后需要转为clob类型。从而找到XMLAGG用于替换。但是xmlagg报错如下:
select
p.id_,
case when j.jxgz is null then '' else ' 一、教学工作'||chr(10) || j.jxgz ||chr(10) end
|| case when bkjx.bkjxgz is null then '' else ' (一)、本科教学工作'||chr(10) || bkjx.bkjxgz ||chr(10) end
|| case when bkjx.bkjxgz is null then '' else ' (二)、研究生教学工作'||chr(10) || bkjx.bkjxgz ||chr(10) end
|| case when bzrgz.bzrgz is null then '' else ' (三)、班主任工作'||chr(10) || bzrgz.bzrgz ||chr(10) end
|| case when (bkktj.jx ||jxcgj.jl)is null then '' else ' 二、教学研究项目和教学获奖'||chr(10) end
|| case when bkktj.jx is null then '' else bkktj.jx ||chr(10) end
|| case when jxcgj.jl is null then '' else jxcgj.jl ||chr(10) end
|| case when cbjc.jc is null then '' else ' 三、编写教材'||chr(10) || cbjc.jc ||chr(10) end
|| case when xslw.lw is null then '' else ' 四、指导优秀学术论文'||chr(10) || xslw.lw ||chr(10) end
|| case when (yxbzr.aaa ||xkfzr.aaa)is null then '' else ' 五、获优秀班主任、学科(专业)负责人等荣誉称号'||chr(10) end
|| case when yxbzr.aaa is null then '' else yxbzr.aaa ||chr(10) end
|| case when xkfzr.aaa is null then '' else xkfzr.aaa ||chr(10) end
|| case when p.qtjxgz_ is null then '' else ' 六、承担的其他教学工作任务'||chr(10) || p.qtjxgz_ ||chr(10) end
as aaa,
case when nvl(kylw.DI_NUM,0)+nvl(kylw.TXZZ_NUM,0) = 0 then '' else ' 一、收录学术论文(共'
||(nvl(kylw.DI_NUM,0)+nvl(kylw.TXZZ_NUM,0))||'篇,其中第一作者SCI'||kylw.SCI_NUM ||'篇、EI'
||kylw.EI_NUM ||'篇、CSCD'||kylw.CSCD_NUM||'篇;通讯作者共'||kylw.TXZZ_NUM||'篇)'||chr(10) || kylw.aaa ||chr(10) end
||case when kyxm.bbb is null then '' else ' 二、纵向科研项目'||chr(10)||kyxm.bbb ||chr(10) end
||case when kyhj.cc is null then '' else ' 三、科研成果获奖'||chr(10)||kyhj.cc ||chr(10) end
||case when p.hxkyxm_ is null then '' else ' 四、横向科研项目'||chr(10)||p.hxkyxm_ ||chr(10) end
||case when (zzxx.c_num+xypz.d_num+sqzl.z_num) = 0 then '' else ' 五、其他科研工作'||chr(10) end
||case when zzxx.aaa is null then '' else ' (一)、专著'||chr(10)||zzxx.aaa ||chr(10) end
||case when xypz.ddd is null then '' else ' (二)、选育品种(选育品种'||xypz.d_num||'个'||chr(10)||xypz.ddd ||chr(10) end
||case when sqzl.vvv is null then '' else ' (三)、授权专利(共'||sqzl.z_num||'项,其中第一完成人'||sqzl.z_num||'项)'||chr(10)||sqzl.vvv ||chr(10) end
as kygz,
p.other_yj_
from HR_POST_PERSON p
left join (
select
e.person,
' 主要承担本科生'
||c.bk_kc
|| '等'
|| c.bk_num
|| '门课程,研究生'
||d.yjs_kc
|| '等'
|| d.yjs_num
|| '门课程的教学工作'
|| case e.bzr_num when 0 then '' else ',以及班主任工作' end
||'。近五年完成教学工作量共'
|| (c.bk_xs + d.yjs_xs)|| '学时。' as jxgz
from (
select
a.person as person ,
a.kc as bk_kc,
a.js_num as bk_num,
a.xs as bk_xs
from (
select
max(t.person_) as person,
count(t.jx_dx_) as js_num,
max(t.kc_name_) as kc,
max(t.jx_dx_) as dx_name,
sum(t.xs_num_) as xs
from HR_POST_JSKS t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.year_
left join FM_CODE_PUB t2 on t2.CODE_DEFINE = 'T_JXKSXQ' and t2.CODE = t.xq_
where t.JX_DX_ = '本专科生教学' and t.PERSON_ = '1746E51B88A6424FA8CEF6C716DDE643'
group by t.jx_dx_
order by t.jx_dx_ ASC
) a
) c
left join (
select
b.person as person,
b.kc as yjs_kc,
b.js_num as yjs_num,
b.xs as yjs_xs
from (
select
max(t.person_) as person,
count(t.jx_dx_) as js_num,
max(t.kc_name_) as kc,
max(t.jx_dx_) as dx_name,
sum(t.xs_num_) as xs
from HR_POST_JSKS t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.year_
left join FM_CODE_PUB t2 on t2.CODE_DEFINE = 'T_JXKSXQ' and t2.CODE = t.xq_
where t.JX_DX_ = '研究生教学' and t.PERSON_ ='1746E51B88A6424FA8CEF6C716DDE643'
group by t.jx_dx_
order by t.jx_dx_ ASC
)b
) d on d.person = '1746E51B88A6424FA8CEF6C716DDE643'
left join (
select
count(*) as bzr_num ,
max(j.person_) as person
from HR_POST_BKBZR j
where j.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
group by j.person_
) e on e.person = '1746E51B88A6424FA8CEF6C716DDE643'
) j on j.person = p.id_
left join (
select
bk.person_,
--ListAgg(to_char(bk.bkjxgz),chr(10)) within group (order by bk.bkjxgz DESC) as bkjxgz
RTRIM(XMLAGG(XMLPARSE(CONTENT bk.bkjxgz || chr(10) WELLFORMED) ORDER BY bk.bkjxgz DESC).GETCLOBVAL() ,chr(10)) as bkjxgz
from(
select
t.person_,
' '
||substr(max(t1.name),0,4) || '.09-'
|| substr(max(t1.name),6,4) || '.07:' || ' '
|| sum(t.xs_) || '学时:担任'
|| max(t.kc_name_) || '课程等'
|| sum(t.xs_) || '学时,指导毕业生'
|| sum(t.xs_num_) || '人,折合'
|| sum(t.zs_xs_)||'学时。'as bkjxgz
from HR_POST_JSKS t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.year_
left join FM_CODE_PUB t2 on t2.CODE_DEFINE = 'T_JXKSXQ' and t2.CODE = t.xq_
where t.PERSON_ = '1746E51B88A6424FA8CEF6C716DDE643' and t.JX_DX_ = '本专科生教学'
group by t.year_ ,t.person_
order by t.year_ ASC
) bk
group by bk.person_
) bkjx on bkjx.person_ = p.id_
left join (
select
yjs.person_,
--ListAgg(to_char(yjs.yjsjxgz),chr(10)) within group (order by yjs.yjsjxgz DESC) as yjsjxgz
RTRIM(XMLAGG(XMLPARSE(CONTENT yjs.yjsjxgz || chr(10) WELLFORMED) ORDER BY yjs.yjsjxgz DESC).GETCLOBVAL() ,chr(10)) as yjsjxgz
from(
select
t.person_,
' '
||substr(max(t1.name),0,4) || '.09-'
|| substr(max(t1.name),6,4) || '.07:' || ' '
|| sum(t.xs_) || '学时:担任'
|| max(t.kc_name_) || '课程等'
|| sum(t.xs_) || '学时,指导毕业生'
|| sum(t.xs_num_) || '人,折合'
|| sum(t.zs_xs_)||'学时。'as yjsjxgz
from HR_POST_JSKS t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.year_
left join FM_CODE_PUB t2 on t2.CODE_DEFINE = 'T_JXKSXQ' and t2.CODE = t.xq_
where t.PERSON_ = '1746E51B88A6424FA8CEF6C716DDE643' and t.JX_DX_ = '研究生教学'
group by t.year_ ,t.person_
order by t.year_ ASC
) yjs
group by yjs.person_
) yjsjx on yjsjx.person_ = p.id_
left join (
select
bzr.person_,
ListAgg(to_char(bzr.bzrgz),chr(10)) within group (order by bzr.bzrgz DESC) as bzrgz
--RTRIM(XMLAGG(XMLPARSE(CONTENT bzr.bzrgz || chr(10) WELLFORMED) ORDER BY bzr.bzrgz DESC).GETCLOBVAL() ,chr(10)) as bzrgz
from(
select
t.person_,
' ' || substr(min(t1.name),0,4)|| '.09-'
|| substr(max(t1.name),6,4)|| '.07共担任'
||max(t.class_)|| '班班主任,折合学时'
|| sum(t.zh_xs_) || '学时。' as bzrgz
from HR_POST_BKBZR t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.year_
where t.PERSON_ = '1746E51B88A6424FA8CEF6C716DDE643'
group by t.person_,t.class_
) bzr
group by bzr.person_
)bzrgz on bzrgz.person_ = p.id_
left join (
select
jxzlj.person_,
ListAgg(to_char(jxzlj.jx),chr(10)) within group (order by jxzlj.jx DESC) as jx
--RTRIM(XMLAGG(XMLPARSE(CONTENT jxzlj.jx || chr(10) WELLFORMED) ORDER BY jxzlj.jx DESC).GETCLOBVAL() ,chr(10)) as jx
from (
select
t.person_,
' '||t1.name || '学年本科课堂教学质量奖'||t2.name || '。'as jx
from HR_POST_BKJXZL t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.XND_
left join FM_CODE_PUB t2 on t2.CODE_DEFINE = 'T_JSZDHJDJ' and t2.CODE = t.hjdj_
where t.PERSON_ = '1746E51B88A6424FA8CEF6C716DDE643'
)jxzlj
group by jxzlj.person_
)bkktj on bkktj.person_ = p.id_
left join (
select
jxcg.person_,
ListAgg(to_char(jxcg.jl),chr(10)) within group (order by jxcg.jl DESC) as jl
--RTRIM(XMLAGG(XMLPARSE(CONTENT jxcg.jl || chr(10) WELLFORMED) ORDER BY jxcg.jl DESC).GETCLOBVAL() ,chr(10)) as jl
from (
select
t.person_,
' '||t1.name || '学年' || t2.name || '教学成果奖'|| t3.name ||'。' as jl
from HR_POST_JXCG t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.YEAR_
left join FM_CODE_PUB t2 on t2.CODE_DEFINE = 'T_JXCGHJJB' and t2.CODE = t.HJ_LEVEL_
left join FM_CODE_PUB t3 on t3.CODE_DEFINE = 'T_QNJSHJDJ' and t3.CODE = t.HJ_DJ_
where t.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)jxcg
group by jxcg.person_
) jxcgj on jxcgj.person_ = p.id_
left join (
select
jc.person_,
ListAgg(to_char(jc.jc),chr(10)) within group (order by jc.person_ DESC) as jc
--RTRIM(XMLAGG(XMLPARSE(CONTENT jc.jc || chr(10) WELLFORMED) ORDER BY jc.person_ DESC).GETCLOBVAL() ,chr(10)) as jc
from (
select
t.person_,
' '||t.jc_name_ ||','||t.cbs_||','
||to_char(t.cb_date_,'yyyy"."mm')||'出版,'
|| t1.name||',约'||t.br_zs_ ||'字。'as jc
from HR_POST_CBJC t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_CBJCBXJS' and t1.CODE = t.BX_JS_
where t.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)jc
group by jc.person_
)cbjc on cbjc.person_ = p.id_
left join (
select
lw.person_,
ListAgg(to_char(lw.www),chr(10)) within group (order by lw.www DESC) as lw
--RTRIM(XMLAGG(XMLPARSE(CONTENT lw.www || chr(10) WELLFORMED) ORDER BY lw.www DESC).GETCLOBVAL() ,chr(10)) as lw
from (
select
t.person_,
' ' || t1.name || '学年度指导'
|| case when t.LB_ = '7'or t.LB_ = '8' then '本科生'
when t.LB_ = '5'or t.LB_ = '7' then '硕士研究生'
when t.LB_ = '1'or t.LB_ = '2' or t.LB_ = '3'or t.LB_ = '4'then '博士研究生'end
|| t.XSXM_
|| '获'
|| t2.name as www
from HR_POST_ZDYXLW t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.YEAR_
left join FM_CODE_PUB t2 on t2.CODE_DEFINE = 'T_YBYSLWLB' and t2.CODE = t.LB_
where t.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)lw
group by lw.person_
)xslw on xslw.person_ = p.id_
left join (
select
yxbzr.person_,
ListAgg(to_char(yxbzr.aaa),chr(10)) within group (order by yxbzr.aaa DESC) as aaa
--RTRIM(XMLAGG(XMLPARSE(CONTENT yxbzr.aaa || chr(10) WELLFORMED) ORDER BY yxbzr.aaa DESC).GETCLOBVAL() ,chr(10)) as aaa
from (
select
t.person_,
' ' || t1.name || '学年获' || t2.name ||t3.name || '荣誉称号。' as aaa
from HR_POST_YXBZR t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.YEAR_
left join FM_CODE_PUB t2 on t2.CODE_DEFINE = 'DM_RYCHMC' and t2.CODE = t.RYCHMC_
left join FM_CODE_PUB t3 on t3.CODE_DEFINE = 'T_HONER_LEVER' and t3.CODE = t.RYCHJB_
where t.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)yxbzr
group by yxbzr.person_
)yxbzr on yxbzr.person_ = p.id_
left join (
select
fzr.person_,
ListAgg(to_char(fzr.bb),chr(10)) within group (order by fzr.bb DESC) as aaa
--RTRIM(XMLAGG(XMLPARSE(CONTENT fzr.bb || chr(10) WELLFORMED) ORDER BY fzr.bb DESC).GETCLOBVAL() ,chr(10)) as aaa
from (
select
t.person_,
' ' || t1.name || '学年获' || t.HJLB_ ||t.MC_ || '荣誉称号。' as bb
from T_POST_SUBJECT_HEADER t
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'T_XND' and t1.CODE = t.YEAR_
where t.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)fzr
group by fzr.person_
)xkfzr on xkfzr.person_ = p.id_
left join (
select
lw.person,
max(lw.xh) as DI_NUM,
(select count(*) from hr_post_kylw k1 where k1.person_ = '1746E51B88A6424FA8CEF6C716DDE643' and k1.fblx = 'SCI') as SCI_NUM,
(select count(*) from hr_post_kylw k2 where k2.person_ = '1746E51B88A6424FA8CEF6C716DDE643' and k2.fblx = 'EI') as EI_NUM,
(select count(*) from hr_post_kylw k3 where k3.person_ = '1746E51B88A6424FA8CEF6C716DDE643' and k3.fblx = 'CSCD') as CSCD_NUM,
(select count(*) from HR_POST_KYLW_TXZZ k4 where k4.person_ = '1746E51B88A6424FA8CEF6C716DDE643') as TXZZ_NUM,
ListAgg(to_char(lw.bb),chr(10)) within group (order by lw.bb ASC) as aaa
--RTRIM(XMLAGG(XMLPARSE(CONTENT lw.bb || chr(10) WELLFORMED) ORDER BY lw.bb ASC).GETCLOBVAL() ,chr(10)) as aaa
from (
select k.* ,
k.person_ as person ,
rownum as xh,
' '||rownum||'.'|| k.lwmc||','||k.qkmc||','||substr(k.nd,0,4)||','||k.j||'('||k.q||'),('||k.fblx||',IF='||k.yxyz||'),第一作者。' as bb
from HR_POST_KYLW k
where k.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)lw
group by lw.person
)kylw on kylw.person = p.id_
left join (
select
xm.person_,
ListAgg(to_char(xm.bbb),chr(10)) within group (order by xm.bbb ASC) as bbb
--RTRIM(XMLAGG(XMLPARSE(CONTENT xm.bbb || chr(10) WELLFORMED) ORDER BY xm.bbb ASC).GETCLOBVAL() ,chr(10)) as bbb
from (
select
t.person_,
' '||rownum||'.'||t.xmmc||','||t.xmly ||'项目,'||t.lxjf||'万元,'||to_char(t.kssj,'yyyy')||'年,'||t.xmzt||'。' as bbb
from HR_POST_KY_PRO t
where t.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)xm
group by xm.person_
)kyxm on kyxm.person_ = p.id_
left join (
select
hj.person,
ListAgg(to_char(hj.cc),chr(10)) within group (order by hj.cc ASC) as cc
--RTRIM(XMLAGG(XMLPARSE(CONTENT hj.cc || chr(10) WELLFORMED) ORDER BY hj.cc ASC).GETCLOBVAL() ,chr(10)) as cc
from (
select
t.person,
' '||rownum ||'.'||t.hjmc||','||t.hjlb || t.hjdj||','||to_char(to_date(t.hjsj,'yyyy.mm.dd'),'yyyy.mm')||',排名第'||t.hjrpm||'。' as cc
from HR_POST_KYHJ t
where t.person = '1746E51B88A6424FA8CEF6C716DDE643'
)hj
group by hj.person
)kyhj on kyhj.person = p.id_
left join (
select
zz.person_,
zz.c_num,
ListAgg(to_char(zz.aaa),chr(10)) within group (order by zz.aaa ASC) as aaa
--RTRIM(XMLAGG(XMLPARSE(CONTENT zz.aaa || chr(10) WELLFORMED) ORDER BY zz.aaa ASC).GETCLOBVAL() ,chr(10)) as aaa
from (
select
t.person_,
(select count(*) from HR_POST_ZZ where person_ ='1746E51B88A6424FA8CEF6C716DDE643') as c_num,
' '||rownum||'.'||t.zzmc||','|| t.cbs||','||to_char(to_date(t.cbsj,'yyyy.mm.dd'),'yyyy.mm') ||'出版,约'||t.zzs||'万字。' as aaa
from (select * from HR_POST_ZZ z order by z.cbsj DESC)t
where t.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)zz
group by zz.person_,zz.c_num
)zzxx on zzxx.person_ = p.id_
left join (
select
pz.person_,
pz.d_num,
ListAgg(to_char(pz.ddd),chr(10)) within group (order by pz.ddd ASC) as ddd
--RTRIM(XMLAGG(XMLPARSE(CONTENT pz.ddd || chr(10) WELLFORMED) ORDER BY pz.ddd ASC).GETCLOBVAL() ,chr(10)) as ddd
from (
select
(select count(*)from hr_post_pz where person_ = '1746E51B88A6424FA8CEF6C716DDE643')as d_num,
t.person_,
' '||rownum ||'.' ||t.pzmc ||','||to_char(t.sdsj,'yyyy"."mm') ||'国家审定,审定编号:'||t.sdbh||'排名第'||t.sort||'。' as ddd
from (select * from hr_post_pz t1 order by t1.sdsj DESC) t
where t.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)pz
group by pz.person_,pz.d_num
)xypz on xypz.person_ = p.id_
left join (
select
zl.person_,
zl.z_num,
--ListAgg(to_char(zl.vvv),chr(10)) within group (order by zl.vvv ASC) as vvv
RTRIM(XMLAGG(XMLPARSE(CONTENT zl.vvv || chr(10) WELLFORMED) ORDER BY zl.vvv ASC).GETCLOBVAL() ,chr(10)) as vvv
from (
select
t.person_ ,
(select count(*) from HR_POST_ZL where person_ = '1746E51B88A6424FA8CEF6C716DDE643') as z_num,
' '||rownum||'.'||t.pzmc ||','||t.zllx||',专利号:'||t.zlh ||',第'||t.sort||'完成人。' as vvv
from (select * from HR_POST_ZL order by ZQSJ ) t
where t.person_ = '1746E51B88A6424FA8CEF6C716DDE643'
)zl
group by zl.person_,zl.z_num
)sqzl on sqzl.person_ = p.id_
left join T_ORG_DEPT dept on dept.DEPT_ID = p.DEPT_ID
left join FM_CODE_PUB t1 on t1.CODE_DEFINE = 'GB_TECHNIC_NAME' and t1.CODE = p.TECHNIC_
left join FM_CODE_PUB t2 on t2.CODE_DEFINE = 'GP_ZC' and t2.CODE = p.APPLY_DUTY_
left join FM_CODE_PUB t3 on t3.CODE_DEFINE = 'HR_POST_PERSON_SORT' and t3.CODE = p.POST_SORT_
left join FM_CODE_PUB t4 on t4.CODE_DEFINE = 'PUB_SEX' and t4.CODE = p.SEX_
left join FM_CODE_PUB t5 on t5.CODE_DEFINE = 'PUB_NATION' and t5.CODE = p.NATION_
left join FM_CODE_PUB t6 on t6.CODE_DEFINE = 'PUB_POLITY' and t6.CODE = p.POLITY_
where p.id_ = '1746E51B88A6424FA8CEF6C716DDE643'
总体来说是因为使用XMLAGG替换了listAgg,但是listAgg拼接成的是char类型的数据,而xmlAgg拼接成的是对象类型的数据。
猜想是否是因为||,或者case when 语句。或者chr(10)。
1.将数据中用||拼接的数据删除再执行,发现sql执行成功。
2.删掉case when 语句,发现执行成功。
3.chr(10)不影响。
得出结论,case when 的问题。
原因:case when判断clob字段类型为空的时候不能直接使用is null来判断,这样的话会认为clob类型的数据为char类型。
--错误的判断
case when j.jxgz is null then '' else ' 一、教学工作'||chr(10) || j.jxgz ||chr(10) end
搜索如何判断clob类型的字段是否为空得到结论:(原文)判断clob字段是否为空
--正确的判断
case when ( j.jxgz IS NULL OR DBMS_LOB.GETLENGTH(j.jxgz) = 0 )then '' else ' 一、教学工作'||chr(10) || j.jxgz ||chr(10) end
执行,成功。