【问题标题】:Pass a list as a parameter to an oracle query将列表作为参数传递给 oracle 查询
【发布时间】:2019-12-09 08:01:21
【问题描述】:

此代码适用于单个值的查询参数:

public void GetById(long id)
{
  var sql = "SELECT * FROM table1 WHERE id = :id";
  using(var cmd = new OracleCommand(sql, oracleConnection)) {
    cmd.Parameters.Add(new OracleParameter("id", id));
    ...
  }
}

数组或值列表的等价物是什么?

public void GetByIds(long[] ids)
{
  var sql = "SELECT * FROM table1 WHERE id IN (:ids)";
  using(var cmd = new OracleCommand(sql, oracleConnection)) {
    cmd.Parameters.Add(new OracleParameter("ids", /* ??? */));
    ...
  }
}

如果不清楚,我正在寻找可以像这样工作的东西:

sql = "SELECT * FROM table1 WHERE id IN (" + string.Join(',', ids) + ")";

但作为一个干净的参数化查询。

【问题讨论】:

标签: c# oracle sqlparameter


【解决方案1】:

您可以将参数列表作为字符串发送,并使用正则表达式来分隔 id。示例:

select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual

所以

sql = "SELECT * FROM table1 WHERE id IN ( 
 select regexp_substr(:ids,'[^,]+', 1, level) from dual
)";

How to split comma separated string and pass to IN clause of select statement

【讨论】:

  • 我同意来自相关问题之一的评论:硬编码“,”字符是解决方案一部分的任何解决方案都是无效的。 Oracle 应该生成这个而不是应用程序。这也适用于任何类型的字符串分隔符 ' "
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 2019-01-02
相关资源
最近更新 更多