最近修改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更安全高效;
問題解決心情舒暢,在此總結一下。希望能給遇到同樣問題的朋友點幫助。