Сбой хранимой процедуры MySQL при вызове из R

Эта процедура работает из командной строки 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 говорится

Для операторов, которые могут быть определены только во время выполнения для возврата набора результатов, ПРОЦЕДУРА %s не может вернуть набор результатов в данном контексте возникает ошибка.

Можно было бы подумать, что если бы процедура собиралась выдать эту ошибку, она бы выбрасывалась при любых обстоятельствах, а не только из R.

Любые мысли о том, как это исправить?


person dnagirl    schedule 30.08.2010    source источник
comment
Вам удалось запустить свой магазин? Вы можете отметить правильный ответ, который поможет вам? или если ни один из них вы не публикуете сами и отвечаете на него самостоятельно. Так что заинтересованные люди могут найти решение здесь. Спасибо   -  person jangorecki    schedule 06.05.2015
comment
@JanGorecki: мне не удалось запустить хранимую процедуру. Мне пришлось использовать голый запрос. Это было некоторое время назад, и, возможно, пакет R DBI теперь лучше подходит для хранимых процедур.   -  person dnagirl    schedule 07.05.2015
comment
Я не использую MySQL, но я запускал SQL-запросы к базам данных Microsoft SQL с помощью R. Я заметил, что всякий раз, когда в запросе есть что-либо, кроме простого оператора select, процесс завершается ошибкой. Я не знаю, нужно ли это в MySQL, но пробовали ли вы удалить процедуру создания, начальную и конечную строки?   -  person thepule    schedule 21.06.2016


Ответы (3)


Насколько мне известно, вызов процедур SQL из R (dbCallProc) еще формально не реализован (см. справочник от 24 июля 2010 г.: 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

Если это возможно, они покажут вам, как это сделать. Если это не так, они скажут вам, почему.

person Joris Meys    schedule 30.08.2010
comment
Я видел, что dbCallProc еще не реализовано. Вот почему я попробовал прямой запрос, полагая, что то, что работает на других языках, может работать и в R. Спасибо за ссылку на список рассылки. Я обязательно попробую там и отчитаюсь. - person dnagirl; 31.08.2010

Попробуйте добавить:

client.flag=CLIENT_MULTI_STATEMENTS

к вашим параметрам подключения. Это может помочь.

Некоторые подробности об этом есть в RMySQL PDF.

person JJJW    schedule 02.11.2010

Не сейчас о R, но это

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

выглядит немного некрасиво, т.е. похоже на конкатенацию строк. Возможно, драйвер базы данных R плохо воспринимает это. Как правило, вы можете использовать заполнители для переменных и передавать значения в качестве отдельных аргументов. Помимо различных аргументов безопасности, это также заботится о любых проблемах типа / апострофа / чего угодно - может быть, и здесь?

person Nicolas78    schedule 30.08.2010
comment
да, я знаю, что это некрасиво. Но лучшего способа в R я не нашел; поверьте мне, я искал заполнители! В любом случае, я повторил строки, и они верны. И голый запрос создается с помощью того же метода paste. Так что я не думаю, что это проблема строки. Вы правы, что это хорошее место для начала отладки. - person dnagirl; 31.08.2010
comment
Это конкатенация строк, но чаще используется в R. Вам не нужно добавлять sep=' ', кстати, пробел является разделителем по умолчанию. - person Joris Meys; 31.08.2010