2010-08-30 6 views
9

Este procedimiento funciona desde la línea de comandos de MySQL tanto de forma remota como localhost y funciona cuando se llama desde PHP. En todos los casos las subvenciones son adecuados:El procedimiento almacenado de MySQL falla cuando se llama desde 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 

estoy tratando de llamarlo desde 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 consulta al descubierto funciona muy bien. La llamada a procedimiento falla con

RApache Advertencia/Error !!! Error en mysqlExecStatement (conn, declaración, ...): controlador RS-DBI: (no podía correr declaración: PROCEDIMIENTO myDB.lee_expout no puede devolver un resultado establecido en el contexto dado)

el MySQL docs dicen

Para los estados que se pueden determinar solo en el tiempo de ejecución para devolver un resultado establecer, un PROCEDIMIENTO% s no puede devolver un resultado establecido en el error de contexto dado se produce.

Uno podría pensar que si un procedimiento se va a lanzar ese error, que sería lanzado en todas las circunstancias en lugar de sólo de R.

Alguna idea sobre cómo solucionar este problema?

+0

¿se las arregló para ejecutar el proceso de la tienda? ¿Puedes marcar la respuesta correcta que te ayuda? o si ninguno de ellos haces una publicación propia y la respondes.Entonces las personas interesadas pueden encontrar una solución aquí. Gracias – jangorecki

+1

@ JanGorecki: No logré ejecutar el procedimiento almacenado. Tuve que usar la consulta simple. Esto fue hace un tiempo y tal vez el paquete DBI de R sea mejor ahora con los procedimientos almacenados. – dnagirl

+0

No uso MySQL, pero he ejecutado consultas SQL en bases de datos Microsoft SQL utilizando R. Observé que siempre que, en la consulta, hay algo más que la instrucción de selección vacía, el proceso falla. No sé si es necesario en MySQL, pero ¿ha intentado eliminar las líneas "crear procedimiento", "comenzar" y "finalizar"? – thepule

Respuesta

1

no lo hace ahora cerca de R, pero esto

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

tiene un aspecto un poco feo, es decir, como la concatenación de cadenas. Quizás el controlador de la base de datos de R lo tome mal. En general, puede usar marcadores de posición para variables y pasar los valores como argumentos separados. Además de varios argumentos de seguridad, esto también se ocupa de cualquier tipo/apóstrofo/lo que sea, ¿quizás aquí también?

+0

sí, sé que es feo. Pero no he encontrado una mejor manera en R; créanme que estaba buscando marcadores de posición! En cualquier caso, he echo eco de las cuerdas y están en lo cierto. Y la consulta simple se crea mediante el mismo método 'pegar'. Entonces no creo que sea un problema de cadena. Tienes razón en que es un buen lugar para comenzar la depuración. – dnagirl

+2

Es una concatenación de cadenas, pero se usa con más frecuencia en R. No tiene que agregar el sep = '' por cierto, el espacio es el separador predeterminado. –

3

Por lo que yo sé, la llamada a procedimientos SQL desde R (dbCallProc) aún no se ha implementado formalmente (ver manual de referencia de 24 de julio de 2010: http://cran.r-project.org/web/packages/RMySQL/RMySQL.pdf)

RMySQL se transfiere de S3 para el estilo de programación S4, y es actualmente todavía está en desarrollo (la versión 0.7 es la actual). Le sugiero que la misma pregunta en la lista de correo de base de datos para R:

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

Si es posible, se le mostraremos cómo. Si no es así, te dirán por qué.

+1

Vi que 'dbCallProc' aún no se había implementado. Es por eso que probé una consulta directa, pensando que lo que funciona en otros idiomas también podría funcionar en R. Gracias por el enlace a la lista de correo. Definitivamente intentaré allí e informaré. – dnagirl

3

Trate de añadir:

client.flag = CLIENT_MULTI_STATEMENTS

a los parámetros de conexión. Puede ayudar.

Hay algunos detalles al respecto en el PDF de RMySQL.

Cuestiones relacionadas