在SQL语句中清理存储过程调用

时间:2016-10-10 14:30:39

标签: ruby-on-rails postgresql stored-procedures activerecord

我正在使用Rails,ActiveRecord和Postgresql,并且正在尝试清理执行存储过程的SQL语句:

query =<<-SQL
    SELECT *
    FROM #{stored_procedure_name}
    (
        #{param_1},
        #{param_2}
    )
SQL

上述声明在执行时有效。据我所知,由于参数化(由于我定义函数的方式),应该在数据库层清理存储过程。但是,我如何清理上面的query?我尝试使用ActiveRecord的sanitize方法无法使用像

这样的东西
statement =<<-SQL
    SELECT * FROM ? (?, ?)
SQL

然后传递参数,但这不起作用 - 而且看起来很傻。

1 个答案:

答案 0 :(得分:0)

我就是这样做的:

  1. 就像你一样创建字符串查询,但用命名参数替换?,如下所示:

    statement = <<-SQL
    SELECT * FROM :procedure_name (:param_1, :param_2)
    SQL
    
  2. 现在调用您的查询:

    YourModel.find_by_sql([
      statement,
      {
        procedure_name: 'your_procedure_name',
        param_1: 'your param 1 value',
        param_2: 'your second param value'
      }
    ])
    
  3. 这对我来说可以执行复杂的选择查询,我没有尝试过存储过程,但我不明白它为什么不能工作。