【问题标题】:Sending in comma delimited values to WHERE clause in oracle stored procedure [duplicate]在oracle存储过程中将逗号分隔值发送到WHERE子句[重复]
【发布时间】:2013-07-27 19:48:50
【问题描述】:

我正在将逗号分隔的参数值发送到 Oracle 中的存储过程。参数转到WHERE 子句,我正在尝试实现这样的目标:

valuestring = "ABC123, ABC456, ABC789"



SELECT * 
  FROM Tbl1 
  WHERE column IN (valuestring)

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

任何帮助将不胜感激。

【问题讨论】:

标签: vb.net oracle stored-procedures plsql


【解决方案1】:

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

 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   );

【讨论】:

    【解决方案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;
    

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

    【讨论】:

    • 这个问题经常出现一定是有原因的。如果前端是 VB.net,那么它可能不是旧版应用程序。也许现代开发人员只学习如何连接值,而从未想过是否有更好的方法来处理多个值?
    猜你喜欢
    • 2020-01-10
    • 2018-01-29
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2013-07-22
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多