0

我将逗号分隔的参数值发送到 Oracle 中的存储过程。参数进入一个WHERE子句,我试图实现这样的目标:

valuestring = "ABC123, ABC456, ABC789"



SELECT * 
  FROM Tbl1 
  WHERE column IN (valuestring)

问题是 select 语句无法识别值之间的逗号,它将其作为单个字符串,因此在执行存储过程时它不返回任何值。

任何帮助,将不胜感激。

4

2 回答 2

1

理想情况下,您应该传入一个集合,而不是传入由逗号分隔的值组成的单个字符串。如果你有类似的东西

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;

如果您确实需要传入逗号分隔的字符串,您可以定义相同的集合类型,然后解析字符串以使用类似Tom Kyte 的str2tbl函数来填充集合。但这会比一开始就传入一个集合效率低。

于 2013-07-27T16:37:26.087 回答
0

可以像下面给出的方式传递您的值字符串。这会将整个逗号分隔的字符串转换为不同的行,因此在您想要的任何地方都可以轻松使用。

 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   );
于 2013-07-27T22:18:34.837 回答