Dette er ikke en SQL-udviklerrestriktion, det er bare hvordan bindevariabler fungerer. Du gør effektivt:
select count(*) from foo
where foo.id in ('1,2,3')
... som virkelig er in (to_number('1,2,3'))
, deraf fejlen. Det fungerer for en enkelt værdi, giver ulige resultater for to værdier, hvis dit decimaltegn er et komma, og fejler noget mere.
Du kan ikke indtaste flere værdier ved en bindeprompt eller levere flere værdier til en in()
med et enkelt bind. Du kan snyde vær dog lidt opfindsom. xmltable
funktion vil konvertere den kommaseparerede streng til rækker med én værdi i hver:
var ids varchar2(50);
exec :ids := '1,2,3';
select * from xmltable(:ids);
COLUMN_VALUE
------------
1
2
3
Du kan derefter bruge det som en opslagstabel:
select count(*)
from xmltable(:ids) x
join foo f on f.id = to_number(x.column_value);
COUNT(*)
----------
3