Вставка кадра данных R в таблицу SQL с использованием сохраненного процесса - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть датафрейм в R, содержащий 10 строк и 7 столбцов. Есть хранимая процедура, которая выполняет несколько проверок logi c в фоновом режиме, а затем вставляет данные в таблицу 'commodity_price'.

library(RMySQL)
#Connection Settings
mydb = dbConnect(MySQL(),
                 user='uid',
                 password='pwd',
                 dbname='database_name',
                 host='localhost')

#Listing the tables
dbListTables(mydb)

f= data.frame(
    location= rep('Bhubaneshwar', 4),
    sourceid= c(8,8,9,2),
    product= c("Ingot", "Ingot", "Sow Ingot", "Alloy Ingot"),
    Specification = c('ie10','ic20','se07','se08'),
Price=c(14668,14200,14280,20980),
currency=rep('INR',4),
uom=rep('INR/MT',4)
)

For multiple rows insert, there's a pre-created stored proc 'PROC_COMMODITY_PRICE_INSERT', which I need to call.


for (i in 1:nrow(f))
{
  dbGetQuery(mydb,"CALL PROC_COMMODITY_PRICE_INSERT(
     paste(f$location[i],',',
f$sourceid[i],',',f$product[i],',',f$Specification[i],',',
f$Price[i],',',f$currency[i],',', f$uom[i],',',@xyz,')',sep='')
  );")
}

Я неоднократно получаю сообщение об ошибке.

Error in .local(conn, statement, ...) : 
  could not run statement: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[i],',',
f$sourceid[i],',',f$product[i],',',f$Specification' at line 2

Я пытался использовать RODB C, но он вообще не подключался. Как я могу вставить данные из R-фрейма данных в таблицу 'commodity_price', вызвав сохраненного профи c? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Попытка для l oop:

for (i in 1:nrow(f))
{
  dbGetQuery(mydb,paste("CALL PROC_COMMODITY_PRICE_INSERT(","'",f$location[i],"'",',',"'",
f$sourceid[i],"'",',',"'",f$product[i],"'",',',"'",f$Specification[i],"'",',',"'",
f$Price[i],"'",',',"'",f$currency[i],"'",',',"'",f$uom[i],"'",',','@xyz',sep='',");"))
}
0 голосов
/ 13 апреля 2020

Это, вероятно, из-за использования ', это может работать:

for (i in 1:nrow(f))
{
  dbGetQuery(mydb,paste("CALL PROC_COMMODITY_PRICE_INSERT(",f$location[i],',',
f$sourceid[i],',',f$product[i],',',f$Specification[i],',',
f$Price[i],',',f$currency[i],',', f$uom[i],',',"@xyz",sep='',");"))
}

или однострочный:

dbGetQuery(mydb,paste0("CALL PROC_COMMODITY_PRICE_INSERT('",apply(f, 1, paste0, collapse = "', '"),"');"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...