我有以下Oracle存儲過程,需要對用戶ID的CSV的字符串,將用戶的列表返回到輸出光標的正常工作:存儲過程的參數返回的所有記錄
create or replace PROCEDURE GET_USERS_BY_IDS
(
v_cur OUT sys_refcursor
,v_userIdsCsv IN varchar2 DEFAULT ''
) AS
BEGIN
open v_cur for
with userIds
as
(
select
trim(substr (txt,
instr (txt, ',', 1, level ) + 1,
instr (txt, ',', 1, level+1) - instr (txt, ',', 1, level) -1))
as token
from (select ','||v_userIdsCsv||',' txt
from dual)
connect by level <=
length(v_userIdsCsv)-length(replace(v_userIdsCsv,',',''))+1
)
select
id
,lastname
,firstname
from
users
where
id in (select * from userIds);
END GET_USERS_BY_IDS;
所以在做exec GET_USERS_BY_IDS(:cur1, '123,456')
我可以得到123和456的ID的用戶。但是我想返回所有用戶,如果我傳入一個空字符串,即exec GET_USERS_BY_IDS(:cur1, '')
將返回所有用戶。爲了實現這個目標,我需要更改哪些代碼片段?謝謝。
我不相信你可以有一個where子句測試,其中空字符串=空字符串。爲v_userIdsCsv'1'設置默認值,然後對v_userIdsCsv ='1'進行where子句測試,它應該可以工作。 –
您接受了一個不起作用的答案。如果v_userIdsCsv是一個空字符串,則不會像所期望的那樣獲得所有用戶。證明:'從雙選擇sysdate,其中''='';'。根據我上面的評論,這可以工作:'從雙選擇sysdate,其中'1'='1';'。請編輯此帖子以顯示有效的工作答案,以免混淆未來的搜索者。 –