使用RMySQL创建存储过程

时间:2016-03-14 19:00:40

标签: r rmysql

后台:我正在开发一个从mysql数据库中提取数据的rscript,执行逻辑回归,然后将预测插回到数据库中。我希望在数据库发生故障时整个系统自包含在脚本中。这包括脚本依赖的所有mysql存储过程来聚合后端上的数据,因为这些将在这样的数据库故障中被删除。

问题:我在从R脚本创建存储过程时遇到问题。我正在运行以下内容:

sha384-18dh2ca...

然而,我得到以下错误,似乎涉及DELIMITER更改。

mySQLDriver <- dbDriver("MySQL")
connect <- dbConnect(mySQLDriver, group = connection)
query <- 
"
DROP PROCEDURE IF EXISTS Test.Tester;
DELIMITER //
CREATE PROCEDURE Test.Tester()
BEGIN
/***DO DATA AGGREGATION***/
END // 
DELIMITER ;
"
sendQuery <- dbSendQuery(connect, query)
dbClearResult(dbListResults(connect)[[1]])
dbDisconnect(connect)

我做了什么:我花了很多时间寻找答案,但却什么都没有想出来。我错过了什么?

1 个答案:

答案 0 :(得分:0)

只想跟进这一系列评论。感谢您对此问题的看法。我有几个需要具有此功能的Python脚本,我开始研究Python的相同主题。我发现this question表示答案。问题陈述:

&#34; DELIMITER命令是一个内置的MySQL shell客户端,它只能被该程序(和MySQL Query Browser)识别。如果直接通过API执行SQL语句,则无需使用DELIMITER。

DELIMITER的目的是帮助您避免在语句本身可以包含分号字符时终止CREATE FUNCTION语句的歧义。这在shell客户端中很重要,默认情况下,分号会终止SQL语句。您需要将语句终止符设置为其他字符,以便提交函数体(或触发器或过程)。&#34;

因此,以下代码将在R:

中运行
mySQLDriver <- dbDriver("MySQL")
connect <- dbConnect(mySQLDriver, group = connection)
query <- 
"
CREATE PROCEDURE Test.Tester()
BEGIN
/***DO DATA AGGREGATION***/
END
"
sendQuery <- dbSendQuery(connect, query)
dbClearResult(dbListResults(connect)[[1]])
dbDisconnect(connect)