2010-08-30 3 views
9

Эта процедура работает из командной строки MySQL как удаленно, так и на локальном хосте и работает при вызове с PHP. Во всех случаях гранты адекватны:Ошибка хранимой процедуры MySQL при вызове из R

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 (соед, заявление, ...): драйвер RS-DBI: (может не запустить заявление: ПРОЦЕДУРА myDB.lee_expout не может возвращать результат, установленный в данном контексте)

MySQL docs сказать

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

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

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

+0

Вам удалось запустить ваш магазин proc? можете ли вы отметить правильный ответ, который поможет вам? или если ни один из них не делает свой собственный и сам отвечать на него.Поэтому заинтересованные люди могут найти решение здесь. Спасибо – jangorecki

+1

@JanGorecki: Мне не удалось запустить хранимую процедуру. Мне пришлось использовать голый запрос. Это было давно, хотя и, возможно, пакет DB DB теперь лучше хранит процедуры. – dnagirl

+0

Я не использую MySQL, но я запускал SQL-запросы в базах данных Microsoft SQL, используя R. Я заметил, что всякий раз, когда в запросе есть что-то, кроме голого оператора select, процесс выходит из строя. Я не знаю, нужно ли это в MySQL, но попытались ли вы удалить строки «create procedure», «begin» и «end»? – thepule

ответ

1

Не теперь о R, но это

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

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

+0

Да, я знаю, что это уродливо. Но я не нашел лучшего способа в R; поверьте мне, я искал заполнителей! В любом случае, я выбрал строки, и они верны. Голый запрос создается с помощью одного и того же метода 'paste'. Поэтому я не думаю, что это проблема с строкой. Вы правы, что это хорошее место для начала отладки. – dnagirl

+2

Это конкатенация строк, но используется чаще в R. Вам не нужно добавлять sep = '', между прочим, пространство является разделителем по умолчанию. –

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

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

+1

Я видел, что 'dbCallProc' еще не был реализован. Вот почему я попробовал прямой запрос, полагая, что то, что работает на других языках, может работать и в R. Спасибо за ссылку на список рассылки. Я обязательно попробую там и отчитаюсь. – dnagirl

3

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

client.flag = CLIENT_MULTI_STATEMENTS

к параметрам соединения. Это может помочь.

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

Смежные вопросы