java oracle.sql.struct转字符串_把Oracle查询结果的一列转换为一字符串
今天遇到一個問題,要把SQL查出來的一列轉化為字符串,如查詢語句為:
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。
結果為:
c_fundacco
541000082246
541000150815
541000249050
541000275745
。。。。。。
現在要把查詢結果放到一個字符串v_fundaccos varchar2中,這樣可以在存儲過程錯誤提示中直接輸出這個字符串。
raise_application_error(-20001,v_fundaccos);
第一想到的就是用游標,每次取出一行,然后累加到一個字符串變量中
,可是老大一看,就說這樣會效率挺慢的,能不能不用游標用一個SQL語句實現。我第一的反應就是這不可能的,但是老大既然這么說了,還是得想辦法啊。結果仔細一想,也不是不可能啊,按分組求和的思路可能可以寫出來,把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分組,還是有可能寫出來的,心想,要是字符串也有一個像數值一樣的sum就好了,這樣按r分組,sum()一下就好了。
有問題還是找google,搜字符串相加 oracle,結果還真讓我搜到了一個方便的函數可以解決這個問題。
這個函數為: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.
用這個函數可以根據CONNECT BY條件把一列的值按‘父子’關系顯示,父與子用字符分開,好了,這樣我的問題就有解了:
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;
簡單說來是將一個樹狀結構存儲在一張表里,比如一個表中存在兩個字段:
id,parentid那么通過表示每一條記錄的parent是誰,就可以形成一個樹狀結構。
用上述語法的查詢可以取得這棵樹的所有記錄。
其中COND1是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。
COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。
COND3是過濾條件,用于對返回的所有記錄進行過濾。
rn為用oracle的偽列,這樣我把根結點從一開始start? with? rn=1
prior rn=rn-1為上一條記錄,再用r分組,就可以實現我的需求了。
呵呵,看來Oracle的函數真是多阿,好多都沒有用過,有時間再看看它的分析函數,這樣寫sql就簡單多了
總結
以上是生活随笔為你收集整理的java oracle.sql.struct转字符串_把Oracle查询结果的一列转换为一字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: pdf python 位置_如何使用PD
 - 下一篇: java多线程遇到的问题_关于Java多