【问题标题】:Using array as a parameter in postgres dynamic sql在postgres动态sql中使用数组作为参数
【发布时间】:2014-09-12 21:20:07
【问题描述】:

我正在尝试运行这样的动态查询(只是一个想法):

    declare 
    params text[] ;
    begin 
      params := ARRAY['30', 'sometext'];
      return execute QUERY 'select id, label from "content" where id>$1 and label = $2' using params;
    end ; 

问题是,我的 params 数组可以具有可变长度 - 我可以准备适当的选择查询,但我想使用“using”子句执行它,该数组包含所有用 $ 标记的参数。

可能是这样,或者我应该使用已经放入语句中的值构建整个 select 语句(但是,这是我想避免的)。

【问题讨论】:

  • $1(ID) 和 label 分配的值是多少?我认为还有另一种好方法可以用于您的情况。
  • 即使这是可能的(事实并非如此),您第一次想要混合数据类型时也会遇到麻烦。
  • @Winged Panther:问题在于参数的数量及其值和类型是未知的。参数从客户端应用程序作为对象集合(可变长度的集合)传递,我从中获取值列表,转换为表......是的 - 这是问题;-)

标签: sql arrays postgresql dynamic-sql execute


【解决方案1】:

即使将数组扩展为 USING 的参数列表是可能的(但事实并非如此),当您第一次想要混合数据类型时也会遇到麻烦。

您是否使用%L 说明符查看了format(..)?它不会解决混合类型的问题,但除此之外它会起作用。

regress=> SELECT format('SELECT a FROM b WHERE z = %L and x = %L and y = %L', VARIADIC ARRAY[1, 2, 3]::integer[]);
                        format                         
-------------------------------------------------------
 SELECT a FROM b WHERE z = '1' and x = '2' and y = '3'
(1 row)

虽然引用了值,但这很好,在 SQL 中用单引号引用整数是合法的。

【讨论】:

    【解决方案2】:

    数组本身就是参数的可能值,因此它不能同时是参数值的容器。

    在您的示例中,pl/pgsql 解释器会将USING 之后的整个数组作为$1 参数的值。

    此外,如果语言支持自动将数组取消嵌套到 $N 参数中,它通常不会很合适,因为数组中的值被限制为相同的类型,而 $N 参数则不是。

    【讨论】:

    • 我知道参数类型是问题所在,所以这就是假设使用 varchars 数组的原因。如果是数字参数(并假设参数值是正确的),它应该被正确转换。如果出现转换问题,则应重新调整异常(或者我什至可以在将其发送到查询之前对其进行测试)。我关心的是 varchar 参数——我想确保该过程是经过 SQL 注入验证的。我认为 Craig Ringer 给出的解决方案是一个很好的方向,因为据我所知 format 对于 SQL 注入是安全的。
    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2020-12-30
    • 2023-03-24
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多