从R调用时,MySQL存储过程失败

时间:2010-08-30 20:10:06

标签: mysql stored-procedures r rmysql

此过程可以从MySQL命令行远程和本地主机上运行,​​并且在从PHP调用时可以正常工作。在所有情况下,补助金都足够了:

CREATE PROCEDURE `myDB`.`lee_expout` (IN e int, IN g int)
BEGIN

select lm.groupname, lee.location, starttime, dark,
  inadist,smldist,lardist,emptydur,inadur,smldur,lardur,emptyct,entct,inact,smlct,larct
from lee join leegroup_map lm using (location)
where exp_id= e and std_interval!=0 and groupset_id= g
order by starttime,groupname,location;

END

我试图从R:

调用它
library(DBI)
library(RMySQL)

db <- dbConnect(MySQL(), user="user", password="pswd",
        dbname="myDB", host="the.host.com")

#args to pass to the procedure
exp_id<-16
group_id<-2

#the procedure call
p <- paste('CALL lee_expout(', exp_id, ',', group_id,')', sep= ' ') 

#the bare query
q <- paste('select lm.groupname, lee.location, starttime, dark,
inadist,smldist,lardist,emptydur,inadur,smldur,lardur,emptyct,entct,inact,smlct,larct
from lee join leegroup_map lm using (location)
where exp_id=', 
exp_id, 
' and std_interval!=0 and groupset_id=', 
group_id, 
'order by starttime,groupname,location', sep=' ') 

rs_p <- dbSendQuery(db, statement=p) #run procedure and fail
p_data<-fetch(rs_p,n=30)

rs_q <- dbSendQuery(db, statement=q) #or comment out p, run query and succeed
q_data<-fetch(rs_q,n=30)

裸查询运行正常。过程调用失败,带

  

RApache警告/错误!!!错误   mysqlExecStatement(conn,声明,   ...):RS-DBI驱动程序:(不能   运行声明:程序   myDB.lee_expout无法返回   在给定的上下文中设置结果)

MySQL docs

  

对于可以确定的陈述   仅在运行时返回结果   设置,一个程序%s不能返回一个   给定上下文错误中的结果集   发生。

有人会认为,如果某个程序会抛出该错误,那么它将在所有情况下抛出,而不仅仅是从R抛出。

有关如何解决这个问题的想法吗?

3 个答案:

答案 0 :(得分:3)

据我所知,从R(dbCallProc)调用SQL过程尚未正式实现(参见2010年7月24日的参考手册:http://cran.r-project.org/web/packages/RMySQL/RMySQL.pdf

RMySQL从S3转换为S4编程风格,目前仍处于开发阶段(0.7版本是当前版本)。我建议你在R的数据库邮件列表上提出同样的问题:

https://stat.ethz.ch/mailman/listinfo/r-sig-db

如果有可能,他们会告诉你如何。如果不是,他们会告诉你原因。

答案 1 :(得分:3)

尝试添加:

client.flag = CLIENT_MULTI_STATEMENTS

连接参数。这可能有所帮助。

在RMySQL PDF中有一些关于此的细节。

答案 2 :(得分:1)

现在不要关于R,但是这个

p <- paste('CALL lee_expout(', exp_id, ',', group_id,')', sep= ' ') 

确实看起来有点难看,就像字符串连接一样。也许R的数据库驱动程序很糟糕。通常,您可以使用占位符作为变量,并将值作为单独的参数传递。除了各种安全论据,这也会处理任何类型/撇号/任何问题 - 也许在这里?