Klassische Situation, die jeder hat. Sie können eine Abfragezeichenfolge dynamisch basierend auf Ihrem Array oder so bilden. Und als OPEN CURSOR verwenden. .
DECLARE
v_mystring VARCHAR(50);
v_my_ref_cursor sys_refcursor;
in_string varchar2='''abc'',''bcd''';
id2 varchar2(10):='123';
myrecord tablename%rowtype;
BEGIN
v_mystring := 'SELECT a.*... from tablename a where name= :id2 and
id in('||in_string||')';
OPEN v_my_ref_cursor FOR v_mystring USING id2;
LOOP
FETCH v_my_ref_cursor INTO myrecord;
EXIT WHEN v_my_ref_cursor%NOTFOUND;
..
-- your processing
END LOOP;
CLOSE v_my_ref_cursor;
END;
Die IN-Klausel unterstützt maximal 1000 Elemente. Sie können stattdessen immer eine Tabelle zum Verbinden verwenden. Diese Tabelle kann eine Global Temporary Table(GTT)
sein deren Daten für diese bestimmte Sitzung sichtbar sind.
Dennoch können Sie eine nested table
verwenden auch dafür (wie PL/SQL-Tabelle)
TABLE()
konvertiert eine PL/Sql-Tabelle in ein SQL-verständliches Tabellenobjekt (eigentlich ein Objekt)
Ein einfaches Beispiel dafür unten.
CREATE TYPE pr AS OBJECT
(pr NUMBER);
/
CREATE TYPE prList AS TABLE OF pr;
/
declare
myPrList prList := prList ();
cursor lc is
select *
from (select a.*
from yourtable a
TABLE(CAST(myPrList as prList)) my_list
where
a.pr = my_list.pr
order by a.pr desc) ;
rec lc%ROWTYPE;
BEGIN
/*Populate the Nested Table, with whatever collection you have */
myPrList := prList ( pr(91),
pr(80));
/*
Sample code: for populating from your TABLE OF NUMBER type
FOR I IN 1..your_input_array.COUNT
LOOP
myPrList.EXTEND;
myPrList(I) := pr(your_input_array(I));
END LOOP;
*/
open lc;
loop
FETCH lc into rec;
exit when lc%NOTFOUND; -- Your Exit WHEN condition should be checked afte FETCH iyself!
dbms_output.put_line(rec.pr);
end loop;
close lc;
END;
/