Ich habe folgende Oracle gespeicherte Prozedur, die auf einer Reihe von CSV-Datei, die Benutzer-IDs nimmt die Liste der Benutzer mit dem Ausgang Cursor, der gut arbeitet zurückkehren würde: gespeicherte Prozedur Parameter von CSV-Eingang alle Datensätze zurück
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;
so durch exec GET_USERS_BY_IDS(:cur1, '123,456')
kann ich Benutzer von IDs von 123 und 456 erhalten. Allerdings möchte ich ALLE Benutzer zurückgeben, wenn ich eine leere Zeichenfolge übergeben, dh exec GET_USERS_BY_IDS(:cur1, '')
würde alle Benutzer zurückgeben. Was muss ich im Sprocode ändern, um das zu erreichen? Vielen Dank.
Ich glaube nicht, dass Sie einen Where-Klausel Test haben können, wo leere Zeichenfolge = leere Zeichenfolge. Nehmen Sie Ihren Standardwert für v_userIdsCsv '1' vor, und machen Sie dann Ihren Where-Klausel-Test für v_userIdsCsv = '1', und es sollte funktionieren. –
Sie haben eine Antwort angenommen, die nicht funktioniert. Wenn v_userIdsCsv eine leere Zeichenfolge ist, erhalten Sie nicht alle Benutzer wie erwartet. Beweis: 'select sysdate from dual where '' = '';'. Dies funktioniert jedoch gemäß meinem obigen Kommentar: 'select sysdate from dual wobei '1' = '1';'. Bitte bearbeiten Sie diesen Beitrag, um eine gültige funktionierende Antwort anzuzeigen, um zukünftige Suchende nicht zu verwirren. –