2010-08-30 3 views
9

aufgerufen wird Diese Prozedur funktioniert von der MySQL-Befehlszeile sowohl remote und auf localhost und es funktioniert, wenn von PHP aufgerufen. In allen Fällen sind die Zuschüsse ausreichend:MySQL gespeicherte Prozedur schlägt fehl, wenn von 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 

Ich versuche es von R zu nennen:

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) 

Die bloße Abfrage läuft gut. Der Prozeduraufruf nicht mit

RApache Warning/Error !!! Fehler bei mysqlExecStatement (conn, aussage, ...): RS-DBI-Treiber: (konnte nicht Lauf Aussage: VERFAHREN myDB.lee_expout nicht wieder ein Ergebnis im gegebenen Kontext setzen können)

die MySQL docs sagen

Für Aussagen, die 0 bestimmt werden kannnur zur Laufzeit ein Ergebnis zurückgeben gesetzt, ein PROCEDURE% s kann nicht zurückgegeben werden Ergebnis im angegebenen Kontext Fehler auftritt.

Man würde denken, dass, wenn ein Verfahren, dass Fehler werfen würde, wäre es, statt nur von R. unter allen Umständen geworfen wird

Irgendwelche Gedanken darüber, wie dieses Problem beheben?

+0

haben Sie es geschafft, Ihren Store Proc auszuführen? Kannst du die richtige Antwort markieren, die dir hilft? oder wenn keiner von ihnen eine eigene Post macht und sie selbst beantwortet.So können die Interessenten hier eine Lösung finden. Danke – jangorecki

+1

@ JanGorecki: Ich habe es nicht geschafft, die gespeicherte Prozedur auszuführen. Ich musste die bloße Abfrage verwenden. Das war vor einiger Zeit und vielleicht ist das DBI-Paket von R jetzt besser mit gespeicherten Prozeduren. – dnagirl

+0

Ich benutze nicht MySQL, aber ich habe SQL-Abfragen auf Microsoft SQL-Datenbanken mit R ausgeführt. Ich habe festgestellt, dass, wenn in der Abfrage gibt es etwas anderes als die bare-Select-Anweisung, der Prozess fehlschlägt. Ich weiß nicht, ob es in MySQL notwendig ist, aber haben Sie versucht, die Zeilen "create procedure", "begin" und "end" zu entfernen? – thepule

Antwort

1

jetzt nicht über R, aber die

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

sieht ein bisschen hässlich, das heißt wie die String-Verkettung. Vielleicht nimmt Rs Datenbanktreiber das schlecht. Im Allgemeinen können Sie Platzhalter für Variablen verwenden und die Werte als separate Argumente übergeben. Neben verschiedenen Sicherheitsargumenten, kümmert sich das auch um jeden Typ/Apostroph/was auch immer - vielleicht auch hier?

+0

Ja, ich weiß, es ist hässlich. Aber ich habe keinen besseren Weg in R gefunden; Glaub mir, ich habe Platzhalter gesucht! Auf jeden Fall habe ich die Saiten wiederholt und sie sind korrekt. Und die bloße Abfrage wird über die gleiche "Paste" -Methode erstellt. Also ich denke nicht, dass es ein String-Problem ist. Du hast recht, dass es ein guter Ort ist, um mit dem Debuggen zu beginnen. – dnagirl

+2

Es ist String-Verkettung, aber häufiger in R verwendet. Sie müssen die sep = '' nebenbei hinzufügen, Leerzeichen ist das Standardtrennzeichen. –

3

Soweit ich weiß, ist SQL-Prozeduren von R (dbCallProc) Aufruf noch nicht formal umgesetzt (siehe Referenzhandbuch vom 24. Juli 2010: http://cran.r-project.org/web/packages/RMySQL/RMySQL.pdf)

RMySQL von S3 zu S4 Programmierstil übertragen wird, und ist derzeit noch in Entwicklung (Version 0.7 ist die aktuelle). Ich schlage vor, Sie die gleiche Frage auf der Datenbank-Mailingliste für R:

https://stat.ethz.ch/mailman/listinfo/r-sig-db

Wenn es möglich ist, werden sie zeigen Ihnen, wie. Wenn nicht, sagen sie dir warum.

+1

Ich habe gesehen, dass 'dbCallProc' noch nicht implementiert wurde. Deshalb habe ich versucht, eine direkte Abfrage durchzuführen, um herauszufinden, dass das, was in anderen Sprachen funktioniert, auch in R funktioniert. Danke für den Link zur Mailingliste. Ich werde es definitiv versuchen und melden. – dnagirl

3

Versuchen Zugabe:

client.flag = CLIENT_MULTI_STATEMENTS

auf die Verbindungsparameter. Es kann helfen.

Es gibt einige Details dazu in der RMySQL PDF.

Verwandte Themen