Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ror4中调用MySQL存储过程_Mysql_Ruby On Rails_Ruby On Rails 4_Rails Activerecord_Mysql 5.5 - Fatal编程技术网

在Ror4中调用MySQL存储过程

在Ror4中调用MySQL存储过程,mysql,ruby-on-rails,ruby-on-rails-4,rails-activerecord,mysql-5.5,Mysql,Ruby On Rails,Ruby On Rails 4,Rails Activerecord,Mysql 5.5,有几个例子,但其中没有一个是非常明确的(或旧版本) 我想调用MySQL过程并检查返回状态(在rails4.2中)。我看到的最常见的方法是调用result=ActiveRecord::Base.connection.execute(“调用示例\u proc()”),但在一些地方,人们编写了一个准备好的方法result=ActiveRecord::Base.connection.execute\u过程(“存储过程名称”,arg1,arg2)(但它没有编译) 那么,调用并获取MySQL过程状态的正确方

有几个例子,但其中没有一个是非常明确的(或旧版本)

我想调用MySQL过程并检查返回状态(在rails
4.2中)。我看到的最常见的方法是调用
result=ActiveRecord::Base.connection.execute(“调用示例\u proc()”)
,但在一些地方,人们编写了一个准备好的方法
result=ActiveRecord::Base.connection.execute\u过程(“存储过程名称”,arg1,arg2)
(但它没有编译)

那么,调用并获取MySQL过程状态的正确方法是什么呢

编辑:


以及如何安全地发送参数,其中第一个参数是整数、第二个字符串和第三个布尔值

Rails 4
ActiveRecord::Base
不支持
execute\u过程
方法,尽管
result=ActiveRecord::Base.connection
仍然有效。即

result = ActiveRecord::Base.connection.execute("call example_proc('#{arg1}','#{arg2}')")

你可以试试下面的毗瑟奴方法

你也可以试试

ActiveRecord::Base.connections.exec_query("call example_proc('#{arg1}','#{arg2}')")

通常,您应该能够在常规的
方法中调用存储过程,其中
为给定模型选择
方法:

YourModel.where("YOUR_PROC(?, ?)", var1, var2)
至于您的评论“底线是,我希望在以后的过程验证中使用最正确的方法(针对警告和错误)”,我想这总是取决于您实际想要实现什么以及您希望代码的可读性

例如,如果希望返回模型属性的行,那么最好将上述语句与
where
方法一起使用。另一方面,如果您编写一些sql适配器,那么您可能希望转到ActiveRecord::Base.connection.execute级别


顺便说一句,这里应该提到存储过程性能。在一些数据库中,数据库在存储过程的第一次运行时进行存储过程优化。但是,您传递给第一次运行的参数可能不是以后将更频繁地在其上运行的参数。因此,对于您的案例,您的存储过程可能会以“非最优”的方式自动优化。这可能是也可能不是这样发生的,但是在使用动态PARAMS存储的PROC时应该考虑的事情。

一般来说,您应该能够调用一个常规的<代码>中的存储过程,在这里,对于一个给定的模型:或<代码>选择方法:您的模型。(“You-Pro(?,)),VAR1,VAR2)不是更容易吗?或者你有一些额外的要求?正如你所看到的,你们都有不同的方法。如果
execute\u过程
被弃用,我想是因为某种原因(更好的方法/新方法)。总之,我希望在以后的过程验证中使用最正确的方法(针对警告和错误)。至于验证部分——因为它是一个过程(不返回值),所以唯一的验证是:通过/失败/警告。虽然它工作正常,但我不确定它是否安全。首先,如果其中一个参数包含
,则过程将中断。第二,如果其中一个参数是
text');从标签中删除-如何安全发送此参数(其中第一个是整数,第二个是字符串,第三个是布尔值)?