我正在使用Rails,ActiveRecord和Postgresql,并且正在尝试清理执行存储过程的SQL语句:
query =<<-SQL
SELECT *
FROM #{stored_procedure_name}
(
#{param_1},
#{param_2}
)
SQL
上述声明在执行时有效。据我所知,由于参数化(由于我定义函数的方式),应该在数据库层清理存储过程。但是,我如何清理上面的query
?我尝试使用ActiveRecord的sanitize
方法无法使用像
statement =<<-SQL
SELECT * FROM ? (?, ?)
SQL
然后传递参数,但这不起作用 - 而且看起来很傻。
答案 0 :(得分:0)
我就是这样做的:
就像你一样创建字符串查询,但用命名参数替换?
,如下所示:
statement = <<-SQL
SELECT * FROM :procedure_name (:param_1, :param_2)
SQL
现在调用您的查询:
YourModel.find_by_sql([
statement,
{
procedure_name: 'your_procedure_name',
param_1: 'your param 1 value',
param_2: 'your second param value'
}
])
这对我来说可以执行复杂的选择查询,我没有尝试过存储过程,但我不明白它为什么不能工作。