天天看點

oracle拼接字元串和數字,oracle多個結果集拼接字元串;where id in 字元串

最近修改oracle觸發器,在過程中遇到兩個問題:

select lastname from hrmresource where id in

(waigaunyanshourens);

此sql隻要功能:根據id 到人力資源表找相應的人名;

此處waigaunyanshourens

是一個存儲外觀驗收人變量;原隻是一個存儲外觀驗收人的id變量,現在界面要求外觀驗收人可以多選,如(41,42,43);現在問題來了:

(1.)一條sql不可能接收多個結果集;

(2.)我還的傳回的是 人名集的字元串,如(人名A,人名B,人名C)

剛開始也認為挺簡單的 ,運用遊标處理一下就可以了。不過在多次試驗後發現解決有點困難

第一種思路:

定義遊标:

cursor cur_wgys is select lastname from

hrmresource where id in (waigaunyanshourens);

c_wg cur_wgys%rowtype;

使用遊标:

for c_wg in cur_wgys loop

dbms_output.put_line(c_wg.lastname);

waiguanstr := waiguanstr ||','|| c_wg.lastname;

end

loop;

dbms_output.put_line(ltrim(waiguanstr,','));

這樣整體也就解決了這兩個問題;在執行觸發器的時候都沒問題;但在觸發時會對這

cursor cur_wgys is select lastname from

hrmresource where id in (waigaunyanshourens);

行,報“無效數字”的錯誤;

第二種思路:由于第一種思路老是不知道什麼原因,也就另尋他路;

select ltrim(max(sys_connect_by_path(lastname,

',')),',')

from (select lastname, rownum t from

hrmresource where id

in(waigaunyanshourens) connect by prior t = t - 1 start with t = 1;

此種方法比較簡潔;不要要遊标;直接就可以接收多個結果集,并且将結果集自動拼接成用逗号隔開的字元串;

運用此種發放正常了解這是沒問題的;可是也是這樣在第二行報“無效數字”。

綜上兩種方法:給自己的感覺是這兩種方法都是正确的,不過還是哪的細節沒注意,導緻報錯;

尋找原因發現:id類型是INTEGER;而這個waigaunyanshourens(41,42,43)是一個字元串;

現在問題也找出來了,也試了各種方法,最終終于解決了,對此一番折騰,在此記錄,共大家參考!!!

第一種解決方法:

定義遊标:

cursor cur_wgys is select lastname from

hrmresource where

INSTR( (select ','

|| waigaunyanshouren ||

',' from formtable_main_112

where requestid =

:new.requestid), ',' || TRIM(TO_CHAR(id )) ||

',' ) > 0;

c_wg cur_wgys%rowtype;

使用遊标:

for c_wg in cur_wgys loop

dbms_output.put_line(c_wg.lastname);

waiguanstr := waiguanstr ||','|| c_wg.lastname;

end loop;

dbms_output.put_line(ltrim(waiguanstr,','));

輸出結果:

人名A

人名B

人名C

人名A,人名B,人名C

第二種解決方法:

select

ltrim(max(sys_connect_by_path(lastname, ',')),',') into

waigaunyanshourens from (select lastname, rownum

t from hrmresource

where INSTR( (select ','

|| waigaunyanshouren ||

',' from formtable_main_112

where requestid =

:new.requestid), ',' || TRIM(TO_CHAR(id )) ||

',' ) >

0) connect by prior t = t - 1 start with t = 1;

dbms_output.put_line(waigaunyanshourens||'==============');

輸出結果:人名A,人名B,人名C==============

這樣就解決了where id in (string)的問題

關鍵就是where後面這句話,看似挺長挺亂的,不過就是一個類似一個 like,但絕對比like更安全高效;

問題解決心情舒暢,在此總結一下。希望能給遇到同樣問題的朋友點幫助。