Dit is geen beperking voor SQL-ontwikkelaars, het is gewoon hoe bindvariabelen werken. Je doet effectief:
select count(*) from foo
where foo.id in ('1,2,3')
... wat echt in (to_number('1,2,3'))
. is , vandaar de fout. Het werkt voor een enkele waarde, geeft oneven resultaten voor twee waarden als uw decimaalteken een komma is, en faalt voor iets meer.
U kunt niet meerdere waarden invoeren bij een bindprompt, of meerdere waarden opgeven voor een in()
met een enkele binding. Je kunt bedriegen wel een beetje inventief zijn. De xmltable
functie converteert de door komma's gescheiden tekenreeks naar rijen met één waarde in elk:
var ids varchar2(50);
exec :ids := '1,2,3';
select * from xmltable(:ids);
COLUMN_VALUE
------------
1
2
3
U kunt die dan als opzoektabel gebruiken:
select count(*)
from xmltable(:ids) x
join foo f on f.id = to_number(x.column_value);
COUNT(*)
----------
3