2010-08-30 20 views
9

Questa procedura funziona dalla riga di comando MySQL sia in remoto che su localhost e funziona quando viene chiamata da PHP. In tutti i casi le borse di studio sono adeguate:La procedura memorizzata MySQL non riesce se richiamata da 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 

sto cercando di chiamare da 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) 

La query nuda funziona benissimo. La chiamata di procedura non riesce con

Rapache Attenzione/Errore !!! Errore in mysqlExecStatement (conn, dichiarazione, ...): il driver RS-DBI: (non poteva run dichiarazione: PROCEDURA myDB.lee_expout non può restituire un risultato impostato nel contesto dato)

il MySQL docs dire

Per istruzioni determinabili solo in fase di runtime per restituire un risultato impostato, una PROCEDURA% s non può restituire un risultato impostato nell'errore di contesto dato .

Si potrebbe pensare che se una procedura stavano per gettare quel errore, sarebbe stato gettato in tutte le circostanze, invece di proprio da R.

Ogni pensiero su come risolvere questo problema?

+0

sei riuscito a gestire il tuo store proc? puoi contrassegnare la risposta corretta che ti aiuta? o se nessuno di loro si pubblica da solo e risponde da solo.Quindi le persone interessate possono trovare una soluzione qui. Grazie – jangorecki

+1

@JanGorecki: non sono riuscito a eseguire la stored procedure. Ho dovuto usare la query nuda. Questo è stato un po 'di tempo fa e forse il pacchetto DBI di R è meglio sulle stored procedure ora. – dnagirl

+0

Non utilizzo MySQL, ma ho eseguito query SQL su database Microsoft SQL utilizzando R. Ho notato che ogniqualvolta, nella query, c'è qualcosa tranne la semplice istruzione select, il processo fallisce. Non so se è necessario in MySQL, ma hai provato a rimuovere le righe "create procedure", "begin" e "end"? – thepule

risposta

1

non fare ora circa R, ma questo

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

ha un aspetto un po 'brutto, vale a dire come la concatenazione di stringhe. Forse il driver del database di R lo prende male. In generale, è possibile utilizzare i segnaposto per le variabili e trasmettere i valori come argomenti separati. Oltre a vari argomenti di sicurezza, questo si occupa anche di qualsiasi tipo/apostrofo/qualsiasi problema - forse anche qui?

+0

sì, lo so che è brutto. Ma non ho trovato un modo migliore in R; credimi, stavo cercando dei segnaposto! In ogni caso, ho echeggiato le corde e sono corrette. E la query nuda viene creata tramite lo stesso metodo 'paste'. Quindi non penso che sia un problema di stringa. Hai ragione che è un buon posto per iniziare il debug però. – dnagirl

+2

È una concatenazione di stringhe, ma usata più spesso in R. Non è necessario aggiungere sep = '' a proposito, lo spazio è il separatore predefinito. –

3

Per quanto ne so, chiamando procedure SQL da R (dbCallProc) non è ancora formalmente implementato (vedere il manuale di riferimento del 24 luglio 2010: http://cran.r-project.org/web/packages/RMySQL/RMySQL.pdf)

RMySQL è trasferito da S3 a stile di programmazione S4, ed è attualmente ancora in fase di sviluppo (la versione 0.7 è quella attuale). Vi suggerisco di chiedere la stessa domanda sulla mailing list del database per R:

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

Se è possibile, vi mostreremo come. Se non lo è, ti diranno perché.

+1

Ho visto che 'dbCallProc' non è stato ancora implementato. Ecco perché ho provato una query semplice, immaginando che ciò che funziona in altre lingue potrebbe funzionare anche in R. Grazie per il link alla mailing list. Ci proverò sicuramente e ci riporterò. – dnagirl

3

Prova ad aggiungere:

client.flag = CLIENT_MULTI_STATEMENTS

per i parametri di connessione. Potrebbe essere d'aiuto

Ci sono alcuni dettagli su questo nel PDF RMySQL.

Problemi correlati