Это:
select * from PRODUCTS a
where a.prod_ID in ?
никогда не будет работать.
Что бы сработало, передача строки в функцию, которая может возвращать набор строк.
select *
from PRODUCTS a
where a.prod_ID in (select int(column_value)
from table ( split(?,',')) tbl
)
split()
- это пользовательская табличная функция, взятая из рабочей статьи разработчика IBM: Как разбить строку на набор строк (anti-LISTAGG)
CREATE OR REPLACE FUNCTION SPLIT(text VARCHAR(32000), split VARCHAR(10))
RETURNS TABLE(column_values VARCHAR(60))
RETURN WITH rec(rn, column_value, pos) AS
(VALUES (1, VARCHAR(SUBSTR(text, 1,
DECODE(INSTR(text, split, 1),
0,
LENGTH(text),
INSTR(text, split, 1) - 1)),
255),
INSTR(text, split, 1) + LENGTH(split))
UNION ALL
SELECT rn + 1, VARCHAR(SUBSTR(text, pos,
DECODE(INSTR(text, split, pos),
0,
LENGTH(text) - pos + 1,
INSTR(text, split, pos) - pos)),
255),
INSTR(text, split, pos) + LENGTH(split)
FROM rec WHERE rn < 30000 AND pos > LENGTH(split))
SELECT column_value FROM rec;
В зависимости от вашей платформы и версии Db2 могут быть некоторые встроенные опции.
Например, в последних версиях вы можете передать строку XML или JSON со значениями и использовать XMLTABLE () или JSON_TABLE (), чтобы разбить строку на строки.