W idealnym przypadku zamiast przekazywania pojedynczego ciągu składającego się z wartości oddzielonych przecinkami, należy przekazać kolekcję. Jeśli masz coś takiego
CREATE TYPE value_tbl AS TABLE OF VARCHAR2(10);
wtedy możesz przekazać tę kolekcję do swojej procedury i użyć jej w WHERE
klauzula
CREATE OR REPLACE PROCEDURE procedure_name( p_values IN value_tbl )
AS
...
BEGIN
FOR i IN (SELECT *
FROM table_name
WHERE column_name IN (SELECT *
FROM TABLE( p_values )))
LOOP
...
END LOOP;
END;
Jeśli naprawdę musisz przekazać ciąg oddzielony przecinkami, możesz zdefiniować ten sam typ kolekcji, a następnie przeanalizować ciąg, aby zapełnić kolekcję, używając czegoś takiego jak str2tbl
Toma Kyte'a funkcja
. Ale będzie to mniej wydajne niż przekazywanie kolekcji na początek.