Отправка значений с разделителями-запятыми в предложение WHERE в хранимой процедуре оракула

Я отправляю значение параметра с разделителями-запятыми в хранимую процедуру в Oracle. Параметр переходит в предложение WHERE, я пытаюсь добиться чего-то вроде этого:

valuestring = "ABC123, ABC456, ABC789"



SELECT * 
  FROM Tbl1 
  WHERE column IN (valuestring)

Проблема заключается в том, что оператор select не распознает запятые между значениями, он принимает их как одну строку, поэтому при выполнении хранимой процедуры он не возвращает никаких значений.

Любая помощь будет оценена по достоинству.


person user1783490    schedule 27.07.2013    source источник
comment
Рассматривали ли вы динамические запросы? Или, может быть, это поможет stackoverflow.com/questions/242771/   -  person unlimit    schedule 27.07.2013
comment
это был следующий подход, который я имел в виду   -  person user1783490    schedule 27.07.2013


Ответы (2)


В идеале вместо передачи одной строки, состоящей из значений, разделенных запятыми, вы должны передать коллекцию. Если у вас есть что-то вроде

CREATE TYPE value_tbl AS TABLE OF VARCHAR2(10);

затем вы можете передать эту коллекцию в свою процедуру и использовать ее в предложении WHERE

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;

Если вам действительно нужно передать строку, разделенную запятыми, вы можете определить тот же тип коллекции, а затем проанализировать строку для заполнения коллекции, используя что-то вроде функция str2tbl Тома Кайта. Но это будет менее эффективно, чем передача коллекции для начала.

person Justin Cave    schedule 27.07.2013
comment
Должна быть причина, по которой этот вопрос возникает так часто. Если внешний интерфейс VB.net, предположительно, это не устаревшее приложение. Возможно, современные разработчики только учатся конкатенировать значения и никогда не задаются вопросом, есть ли лучший способ обработки нескольких значений? - person APC; 27.07.2013

Может передать вашу строку значения, как показано ниже. Это преобразует всю строку, разделенную запятыми, в разные строки, и, следовательно, ее будет легко использовать везде, где вы хотите.

 SELECT trim(x.column_value.extract('e/text()')) COLUMNS
 from t t, table (xmlsequence(xmltype('<e><e>' || replace(valuestring,':','</e><e>')||  
 '</e></e>').extract('e/e'))) x   );
person Harshit    schedule 27.07.2013