Невозможно передать строковое значение 1,2 в качестве входных данных для запроса оракула

Ниже приведен мой запрос, и я передаю строковое значение 1,2 в качестве значения привязки, но оно показывает ошибку, поскольку это недопустимое число. Я знаю, что IN принимает только число, но здесь мне нужно передать строковое значение

SELECT  e.*
FROM    employee_detail e
WHERE   e.emp_id IN (:emp_id)

person manikandan    schedule 27.06.2017    source источник
comment
Вам нужны динамические списки? Если да, возможно, это будет вам полезно?   -  person Boneist    schedule 27.06.2017
comment
Боюсь, вы должны рассказать нам больше. Я пытался использовать строковые переменные через Lazarus, и проблем не возникло. Я правильно понял: вы хотите передать этому запросу ровно 1 строковое значение 1,2?   -  person am2    schedule 27.06.2017
comment
qry.SQL.Text := 'ВЫБЕРИТЕ * ИЗ BLABLA, ГДЕ BLA IN (:P1)'; qry.ParamByName('P1').AsString := '1,2'; qry.Active:=истина;   -  person am2    schedule 27.06.2017
comment
Проще говоря, вы не можете этого сделать. Oracle не позволяет передавать списки чисел, разделенных запятыми, в виде строк.   -  person Bob Jarvis - Reinstate Monica    schedule 27.06.2017
comment
Как загрузить большое количество строк для сопоставления с базой данных oracle? приводит пример того, как привязать массив значений к коллекция Oracle с использованием Java. С этим вопросом связано несколько других, посвященных темам, аналогичным этому вопросу.   -  person MT0    schedule 27.06.2017


Ответы (2)


Вы можете использовать сравнение строк вместо условия IN.

select ...
from   ...
where  ',' || :emp_id || ',' like '%,' || to_char(emp_id) || ',%'
;
person mathguy    schedule 27.06.2017

In используется с list of values или subqueries.

Вы можете преобразовать разделенные запятыми string в subquery, используя следующий хак:

 SELECT TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level))   
    FROM (SELECT  :emp_id temp FROM DUAL)
    CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+')

Здесь строка 1,2,3 будет преобразована в строку subquery, возвращающую 3 строк.

Итак, конечный результат для вашего случая может быть примерно таким:

SELECT  e.*
FROM    employee_detail e
WHERE   e.emp_id in (
SELECT decode(:emp_id,null,  (select  e.emp_id from dual) 
,TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level)) )  
    FROM (SELECT  :emp_id temp FROM DUAL)
    CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+'))

Обратите внимание, что в этом случае In вернет true, если :emp_id равно null, и это было намеренно достигнуто с помощью функции decode.

person Plirkee    schedule 27.06.2017
comment
IN не используется с коллекциями, он используется либо со списком выражений или подзапрос. MEMBER OF используется с коллекциями. - person MT0; 27.06.2017
comment
@MT0 Хорошо, спасибо за исправление относительно термина, который я использовал. Это действительно подзапрос. - person Plirkee; 27.06.2017