【问题标题】:Oracle: How can I parameterize a list?Oracle:如何参数化列表?
【发布时间】:2011-01-17 23:41:02
【问题描述】:

我有一个带有 where 子句的查询,如下所示:

WHERE field IN ( 1, 2, 3 )

可以对其进行参数化,使其看起来像:

( :list ) 中的 WHERE 字段?

如何创建 :list 参数,假设它是一个整数列表,可以是 1 到 10 个整数?

ASP.net,网络表单,如果有影响的话。

【问题讨论】:

    标签: asp.net sql oracle parameters


    【解决方案1】:

    有两种容纳动态 IN 列表的方式:

    1. 将逗号分隔的列表转换为派生表(AKA 内联视图)
    2. 使用动态 SQL

    非动态


    大多数人更喜欢非动态 SQL 方法 - this link provides various ways to do it。使用它的最大原因:

    WHERE :list LIKE '%,' || t.column || ',%'
    

    ...是上面那个吗:

    1. 永远无法使用索引
    2. 无法匹配列表中的第一个或最后一个参数,因为两端都需要逗号才能匹配

    简单的事实是,它不会按预期工作。 Oracle 10g+ 支持的正则表达式将允许对列进行条件检查,但仍面临将索引呈现为无意义的问题

    动态 SQL


    提到“动态 SQL”,您很可能是 hounded about SQL injection attacks。使用绑定变量可以缓解这种担忧。

    也就是说,动态 SQL 需要对查询进行最少的更改。

    【讨论】:

      【解决方案2】:

      与 SQL Server 相同的答案,已在此处询问:Parameterize an SQL IN clause

      【讨论】:

      • 这是性能最差的途径。上次我看到对该答案的引用时,它被撕成碎片。最好的方法是将字符串/等列表表示形式转换为表格,然后加入它。
      • 你能指出那个讨论吗?我知道这种方法存在妥协,但不确定是否创建临时。每个查询的表将是一个简单的修复。
      • @OMG, @chris - 抱歉,我刚刚重读了这篇文章,不要看已接受的答案,请看投票最多的答案。
      【解决方案3】:

      据我所知,你不能。您将在同一个地方混合值和运算符。

      但是,在 ASP.NET 中自动创建参数数组并动态获取它应该相当简单:

      WHERE field IN (:list1, :list2, :list3, :list4)
      

      【讨论】:

        【解决方案4】:

        “我如何绑定一个 in 列表”这个问题似乎出现了很多。

        在 Oracle 中执行此操作的最简单“技巧”是使用我在此处发布的答案:

        Dynamic query with HibernateCritera API & Oracle - performance

        我不能假装这是我的把戏,因为它来自 Oracle 大师 Tom Kyte 的博客!

        【讨论】:

          猜你喜欢
          • 2020-05-16
          • 2021-12-06
          • 1970-01-01
          • 1970-01-01
          • 2012-08-21
          • 1970-01-01
          • 1970-01-01
          • 2013-09-16
          • 1970-01-01
          相关资源
          最近更新 更多