9

此过程在远程和本地主机上都可以从 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, statement, ...) 中的错误:RS-DBI 驱动程序:(无法运行语句:PROCEDURE myDB.lee_expout 无法在给定上下文中返回结果集)

MySQL文档

对于只能在运行时确定返回结果集的语句,PROCEDURE %s can't return a result set in the given context 发生错误。

人们会认为,如果一个程序要抛出那个错误,它会在所有情况下抛出,而不仅仅是从 R 中抛出。

关于如何解决这个问题的任何想法?

4

3 回答 3

3

尝试添加:

client.flag=CLIENT_MULTI_STATEMENTS

到您的连接参数。它可能会有所帮助。

RMySQL PDF 中有一些关于此的详细信息。

于 2010-11-02T08:46:39.390 回答
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

如果可能的话,他们会告诉你怎么做。如果不是,他们会告诉你原因。

于 2010-08-30T21:45:13.960 回答
1

现在不要谈论 R,但是这个

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

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

于 2010-08-30T20:28:48.090 回答