Idealmente, em vez de passar uma única string composta de valores separados por vírgulas, você passaria uma coleção. Se você tem algo como
CREATE TYPE value_tbl AS TABLE OF VARCHAR2(10);
então você pode passar essa coleção para o seu procedimento e usá-la em um
WHERE
cláusula 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;
Se você realmente precisar passar uma string separada por vírgula, poderá definir o mesmo tipo de coleção e analisar a string para preencher a coleção usando algo como Tom Kyte
str2tbl
função
. Mas isso será menos eficiente do que passar uma coleção para começar.