2016-03-15 11 views
6

Я использую RMySQL и DBI для соединения между R и MySQLвыполнить несколько SQL команд сразу на R

library(RMySQL) 
library(DBI, quietly = TRUE) 

Все работает отлично для одной команды, такие как

sql = "select * from clients" 
con <- dbConnect(MySQL(),user=user, password=password, dbname=dbname, host=host) 
rs <- dbSendQuery(con, sql) 
data <- fetch(rs, n=-1) 
huh <- dbHasCompleted(rs) 
dbClearResult(rs) 
on.exit(dbDisconnect(con)) 

Однако, когда я хочу выполнить несколько команд с помощью;; между ними (например, для установки параметра), он возвращает ошибку. Например

sql = "SET @LAST_TEN_DAY = DATE_ADD(NOW(), INTERVAL -10 DAY); select * from clients where date > @LAST_TEN_DAY" 
con <- dbConnect(MySQL(),user=user, password=password, dbname=dbname, host=host) 
rs <- dbSendQuery(con, sql) 
data <- fetch(rs, n=-1) 
huh <- dbHasCompleted(rs) 
dbClearResult(rs) 
on.exit(dbDisconnect(con)) 

Большое спасибо,

+0

Вы не можете использовать SQL и R как это. Вы должны создать переменную, которая будет хранить значение DATE_ADD (NOW(), INTERVAL, -10 DAY), а затем использовать SQL-запрос 'SELECT * FROM CLIENTS WHERE DATE> ваше значение переменной' – MaxPD

+0

Hi Max, спасибо за в ответ. Могу ли я узнать, как это сделать в R? Потому что, если вы выполняете команду SQL для создания переменной, я не уверен, будет ли эта переменная сохранена для выполнения следующей команды SQL. –

+0

Переменная будет глобальной и может использоваться для любого оператора sql внутри вашего R-кода. – MaxPD

ответ

6

Для нескольких команд, которые мы должны работать следующим образом. DbSendQuery сохранит параметр

sql = "select * from clients where date > @LAST_TEN_DAY" 
con <- dbConnect(MySQL(),user=user, password=password, dbname=dbname, host=host) 
dbSendQuery(con, 'SET @LAST_TEN_DAY = DATE_ADD(NOW(), INTERVAL -10 DAY)') 
rs <- dbSendQuery(con, sql) 
data <- fetch(rs, n=-1) 
huh <- dbHasCompleted(rs) 
dbClearResult(rs) 
on.exit(dbDisconnect(con))