Idéalement, plutôt que de transmettre une seule chaîne composée de valeurs séparées par des virgules, vous transmettriez une collection. Si vous avez quelque chose comme
CREATE TYPE value_tbl AS TABLE OF VARCHAR2(10);
alors vous pouvez passer cette collection dans votre procédure et l'utiliser dans un WHERE
clause
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;
Si vous avez vraiment besoin de transmettre une chaîne séparée par des virgules, vous pouvez définir le même type de collection, puis analyser la chaîne pour remplir la collection en utilisant quelque chose comme str2tbl
de Tom Kyte fonction
. Mais ce sera moins efficace que de passer dans une collection pour commencer.