我将逗号分隔的参数值发送到 Oracle 中的存储过程。参数进入一个WHERE
子句,我试图实现这样的目标:
valuestring = "ABC123, ABC456, ABC789"
SELECT *
FROM Tbl1
WHERE column IN (valuestring)
问题是 select 语句无法识别值之间的逗号,它将其作为单个字符串,因此在执行存储过程时它不返回任何值。
任何帮助,将不胜感激。
我将逗号分隔的参数值发送到 Oracle 中的存储过程。参数进入一个WHERE
子句,我试图实现这样的目标:
valuestring = "ABC123, ABC456, ABC789"
SELECT *
FROM Tbl1
WHERE column IN (valuestring)
问题是 select 语句无法识别值之间的逗号,它将其作为单个字符串,因此在执行存储过程时它不返回任何值。
任何帮助,将不胜感激。
理想情况下,您应该传入一个集合,而不是传入由逗号分隔的值组成的单个字符串。如果你有类似的东西
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
函数来填充集合。但这会比一开始就传入一个集合效率低。
可以像下面给出的方式传递您的值字符串。这会将整个逗号分隔的字符串转换为不同的行,因此在您想要的任何地方都可以轻松使用。
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 );