java oracle.sql.struct转字符串_把Oracle查询结果的一列转换为一字符串
今天遇到一個(gè)問題,要把SQL查出來的一列轉(zhuǎn)化為字符串,如查詢語(yǔ)句為:
select distinct c_fundacco from(
select c_custno from tconfirm tc where tc.c_agencyno='254'? and?? tc.c_status='1'
minus
select c_custno from tfundbrokerrelation tfb where tfb.c_relationtype='0')a,taccoinfo tf where a.c_custno=tf.c_custno。
結(jié)果為:
c_fundacco
541000082246
541000150815
541000249050
541000275745
。。。。。。
現(xiàn)在要把查詢結(jié)果放到一個(gè)字符串v_fundaccos varchar2中,這樣可以在存儲(chǔ)過程錯(cuò)誤提示中直接輸出這個(gè)字符串。
raise_application_error(-20001,v_fundaccos);
第一想到的就是用游標(biāo),每次取出一行,然后累加到一個(gè)字符串變量中
,可是老大一看,就說這樣會(huì)效率挺慢的,能不能不用游標(biāo)用一個(gè)SQL語(yǔ)句實(shí)現(xiàn)。我第一的反應(yīng)就是這不可能的,但是老大既然這么說了,還是得想辦法啊。結(jié)果仔細(xì)一想,也不是不可能啊,按分組求和的思路可能可以寫出來,把sql變一下:
select distinct c_fundacco,1 r from(
select c_custno from tconfirm tc where tc.c_agencyno='254'? and?? tc.c_status='1'
minus
select c_custno from tfundbrokerrelation tfb where tfb.c_relationtype='0')a,taccoinfo tf where a.c_custno=tf.c_custno
這樣用r分組,還是有可能寫出來的,心想,要是字符串也有一個(gè)像數(shù)值一樣的sum就好了,這樣按r分組,sum()一下就好了。
有問題還是找google,搜字符串相加 oracle,結(jié)果還真讓我搜到了一個(gè)方便的函數(shù)可以解決這個(gè)問題。
這個(gè)函數(shù)為:SYS_CONNECT_BY_PATH
SYS_CONNECT_BY_PATH is valid only in hierarchical queries. It returns the path of a column value from root to node, with column values separated by char for each row returned by CONNECT BY condition.
用這個(gè)函數(shù)可以根據(jù)CONNECT BY條件把一列的值按‘父子’關(guān)系顯示,父與子用字符分開,好了,這樣我的問題就有解了:
select max(sys_connect_by_path(c_fundacco||chr(13)||chr(10),' ')v_fundaccos
from (
select distinct c_fundacco,1 r,rownum rn from(
select c_custno from tconfirm tc where tc.c_agencyno='254'
and tc.c_status='1'
minus
select c_custno from tfundbrokerrelation tfb
where tfb.c_relationtype='0'
)a,taccoinfo tf where a.c_custno=tf.c_custno
)
start? with? rn=1
connect? by?? prior rn=rn-1
group by r
這里用
start with cond1
connect by cond2 where cond3;
簡(jiǎn)單說來是將一個(gè)樹狀結(jié)構(gòu)存儲(chǔ)在一張表里,比如一個(gè)表中存在兩個(gè)字段:
id,parentid那么通過表示每一條記錄的parent是誰(shuí),就可以形成一個(gè)樹狀結(jié)構(gòu)。
用上述語(yǔ)法的查詢可以取得這棵樹的所有記錄。
其中COND1是根結(jié)點(diǎn)的限定語(yǔ)句,當(dāng)然可以放寬限定條件,以取得多個(gè)根結(jié)點(diǎn),實(shí)際就是多棵樹。
COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。
COND3是過濾條件,用于對(duì)返回的所有記錄進(jìn)行過濾。
rn為用oracle的偽列,這樣我把根結(jié)點(diǎn)從一開始start? with? rn=1
prior rn=rn-1為上一條記錄,再用r分組,就可以實(shí)現(xiàn)我的需求了。
呵呵,看來Oracle的函數(shù)真是多阿,好多都沒有用過,有時(shí)間再看看它的分析函數(shù),這樣寫sql就簡(jiǎn)單多了
總結(jié)
以上是生活随笔為你收集整理的java oracle.sql.struct转字符串_把Oracle查询结果的一列转换为一字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pdf python 位置_如何使用PD
- 下一篇: java鼠标经过时变色_将鼠标悬停在标签