Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

llamar Store procedure

Estas en el tema de llamar Store procedure en el foro de Mysql en Foros del Web. Buen dia señoras y señores. Resulta que he pensado utilizar los procedures en mysql pero es un poco diferente a sql. Y no he podido ...
  #1 (permalink)  
Antiguo 22/10/2009, 07:48
 
Fecha de Ingreso: mayo-2009
Mensajes: 177
Antigüedad: 15 años
Puntos: 1
Pregunta llamar Store procedure

Buen dia señoras y señores.

Resulta que he pensado utilizar los procedures en mysql pero es un poco diferente a sql. Y no he podido llamar un store procedure que cree en mysql.

El codigo que tengo para la creacion es este:

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
SELECT * FROM tblgrado$$

y la forma en la que intento llamarle es esta:

call p1()

pero esto nada que funciona. y ya he tratado de cambiar el llamado con lo poco que se pero nada que lo hago funcionar. si es necesario, postearé el script de mi base completa, es solo una tablita y el procedure.

Si me puedes brindar un ejemplo o decirme que debo cambiarle a este para que funcione te lo agradeceria enormemente.
  #2 (permalink)  
Antiguo 22/10/2009, 08:01
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: llamar Store procedure

Código sql:
Ver original
  1. mysql> delimiter $$
  2. mysql> CREATE PROCEDURE ejemplo()
  3.     ->  BEGIN
  4.     ->   SELECT *FROM prueba;
  5.     -> END
  6.     ->  $$
  7. Query OK, 0 ROWS affected (0.00 sec)
  8.  
  9. mysql> delimiter ;
  10. mysql> CALL ejemplo();
  11. +---------+
  12. | nombres |
  13. +---------+
  14. | daniel  |
  15. | otro    |
  16. +---------+
  17. 2 ROWS IN SET (0.00 sec)
  18.  
  19. Query OK, 0 ROWS affected (0.00 sec)
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 22/10/2009, 08:23
 
Fecha de Ingreso: mayo-2009
Mensajes: 177
Antigüedad: 15 años
Puntos: 1
Respuesta: llamar Store procedure

El problema es el siguiente para ser mas exacto.
Ya tengo el procedure, pero cuando hago el llamado:

CALL P1();

Me esta arrojando el siguiente error:

#1312 - PROCEDURE prueba.p1 can't return a result set in the given context


y ahi si quedo pero mal por que no lo entiendo.
  #4 (permalink)  
Antiguo 22/10/2009, 08:48
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: llamar Store procedure

Puede que se haya ejecutado bien el store procedure sintacticamente, pero tienes un error en el funcionamiento del mismo.

Postea todo el procedimiento.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 22/10/2009, 09:07
 
Fecha de Ingreso: mayo-2009
Mensajes: 177
Antigüedad: 15 años
Puntos: 1
Respuesta: llamar Store procedure

Huesos te mando todo el codigo de la base de datos, alfinal esta el procedure.

-- Base de datos: `prueba`

CREATE TABLE IF NOT EXISTS `tblgrado` (
`id_grado` bigint(20) NOT NULL AUTO_INCREMENT,
`grado` varchar(20) CHARACTER SET utf8 COLLATE utf8_spanish_ci DEFAULT NULL,
`id_jornada` bigint(20) NOT NULL,
PRIMARY KEY (`id_grado`),
KEY `id_jornada` (`id_jornada`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;

INSERT INTO `tblgrado` (`id_grado`, `grado`, `id_jornada`) VALUES
(1, 'Transición', 1),
(2, 'Primero', 1);


DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
SELECT * FROM tblgrado$$
  #6 (permalink)  
Antiguo 22/10/2009, 09:15
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: llamar Store procedure

Estas declarando mal el procedimiento.
Ejecutalo así:

Código sql:
Ver original
  1. DELIMITER $$
  2. CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
  3. SELECT * FROM tblgrado;
  4. END
  5. $$
  6. delimiter ;
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 22/10/2009, 09:38
 
Fecha de Ingreso: mayo-2009
Mensajes: 177
Antigüedad: 15 años
Puntos: 1
Respuesta: llamar Store procedure

Huesos nada, lo cree como me dijiste, aunque me toco suprimirle el END, ME causaba error. Lo ejecute CALL listar() y no me funciono. que sera?

Valga la aclaracion. estoy usando el mysql del paquete de xampp. version del mysql 5.1.33-community (por si la version tiene alguna diferencia)


DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `listar`()
SELECT * FROM tblgrado$$
DELIMITER ;

Última edición por jucas1987; 22/10/2009 a las 09:47
  #8 (permalink)  
Antiguo 22/10/2009, 09:57
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: llamar Store procedure

sorry... faltó el begin

Código sql:
Ver original
  1. DELIMITER $$
  2. CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
  3. BEGIN
  4. SELECT * FROM tblgrado;
  5. END
  6. $$
  7. delimiter ;
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #9 (permalink)  
Antiguo 22/10/2009, 10:09
 
Fecha de Ingreso: mayo-2009
Mensajes: 177
Antigüedad: 15 años
Puntos: 1
Respuesta: llamar Store procedure

Huesos la verdad agradezco mucho el tiempo que te haz tomado para responderme todas las preguntas pero esta vaina no tiene ganas de funcionar.
ya he creado el procedure tal como me dijiste, y no he tenido problemas.el detalle es que cuando me paro en el gestor de consultas del phpmyadmin que viene incluido en el xampp y trato de llamar el procedure (CALL p1()) me dice lo siguiente:

#1312 - PROCEDURE prueba.p1 can't return a result set in the given context

y ahi si quedo mas aburrido, pues ya no tengo la menor idea.
que me aconsejas, o que otra forma puedo optar para invocar el procedure?
  #10 (permalink)  
Antiguo 22/10/2009, 10:13
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: llamar Store procedure

si usas xampp asumo que estas trabajando con windows.

abre una consola de DOS
inicio->ejecutar->cmd

Ubicate en la carpeta bin de mysql y accede a la consola de mysql.

c:\xampp\mysql\bin>mysql -u root -p
Digita la contraseña de root.

Selecciona la base de datos:

mysql>use tu_DB;

Y en esta instancia llama el procedimiento.

mysql>call p1();

Nos cuentas si se presenta el mismo error
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 22/10/2009, 11:19
 
Fecha de Ingreso: mayo-2009
Mensajes: 177
Antigüedad: 15 años
Puntos: 1
Respuesta: llamar Store procedure

Huesos dame una mano con el comando, no he podido conectarme con la base por que no se donde le digo que se conecte con el usuario root y me esta pidiendo el usuario.
  #12 (permalink)  
Antiguo 22/10/2009, 12:13
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: llamar Store procedure

Donde tengas instalado el xampp, busca la carpeta de mysql. Dentro de la carpeta de mysql hay una carpeta llamada bin. Es ahí donde tienes que ejecutar el comando que te dí.

Como no se en que ubicación instalaste xampp, no te puedo dar una respuesta mas detallada.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #13 (permalink)  
Antiguo 22/10/2009, 12:47
 
Fecha de Ingreso: mayo-2009
Mensajes: 177
Antigüedad: 15 años
Puntos: 1
Respuesta: llamar Store procedure

nada huesos, ya lo hize y todo bien hasta que llame el procedure y no me devolvio ni siquiera un error
  #14 (permalink)  
Antiguo 22/10/2009, 13:40
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: llamar Store procedure

No se que mas decirte (realmente no se como lo haces). Te pongo un ejemplo real de como lo hago.

Código mysql:
Ver original
  1. C:\>cd archivos de programa/mysql/mysql server 5.0/bin
  2.  
  3. C:\Archivos de programa\MySQL\MySQL Server 5.0\bin>mysql -u root -p
  4. Enter password: ***
  5. Welcome to the MySQL monitor.  Commands end with ; or \g.
  6. Your MySQL connection id is 3 to server version: 5.0.27-community-nt
  7.  
  8. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
  9.  
  10. mysql> use pruebas
  11. Database changed
  12. mysql> show tables;
  13. +-------------------+
  14. | Tables_in_pruebas |
  15. +-------------------+
  16. | a                 |
  17. | prueba            |
  18. +-------------------+
  19. 2 rows in set (0.00 sec)
  20.  
  21. mysql> select *from prueba;
  22. +---------+
  23. | nombres |
  24. +---------+
  25. | daniel  |
  26. | otro    |
  27. +---------+
  28. 2 rows in set (0.02 sec)
  29.  
  30. mysql> delimiter $$
  31. mysql> CREATE PROCEDURE ejemplo()
  32.     -> BEGIN
  33.     -> SELECT *FROM prueba;
  34.     -> END
  35.     -> $$
  36. Query OK, 0 rows affected (0.00 sec)
  37.  
  38. mysql> delimiter ;
  39. mysql> call ejemplo();
  40. +---------+
  41. | nombres |
  42. +---------+
  43. | daniel  |
  44. | otro    |
  45. +---------+
  46. 2 rows in set (0.00 sec)
  47.  
  48. Query OK, 0 rows affected (0.01 sec)
  49.  
  50. mysql>

Cuando abro la consola DOS le doy la ruta de mi carpeta bin.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #15 (permalink)  
Antiguo 22/10/2009, 14:03
 
Fecha de Ingreso: mayo-2009
Mensajes: 177
Antigüedad: 15 años
Puntos: 1
Respuesta: llamar Store procedure

Huesos de verdad te agradezco por toda tu colaboracion, intentare arreglarlo en la noche. Y si lo consigo, posteare la solucion al problema mañana.

Gracias..
  #16 (permalink)  
Antiguo 22/10/2009, 15:33
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: llamar Store procedure

Bueno, luego de mucho buscar estoy encontrando alguna documentación específica sobre este error.
Un caso indicado en este link, dice que:
Cita:
Usando Stored Procedures de MySQL en PHP ( MySQL error #1312 )

...

Para usar Stored Procedures en MySQL a través de PHP usted usualmente usa conexiones pdo o mysqli .
De todos modos, si no desea rehacer las conexiones de su aplicación y no requiere ningún parámetro de salida, puede usar “mysql_connect($host, $user, $password, true, 65536);” en la conexión, usando la constante interna mágica 65536 ( CLIENT_MULTI_STATEMENTS ). Pero podrá hacer sólo una llamada a stored procedure por cada conexión, y no tiene soporte para parámetros OUT. Esto no está actualmente documentado, pero puede encontrarse en los archivos header de PHP.

Si usted no usa este método de conexión , obtendrá un error “#1312 – PROCEDURE database.procedure can’t return a result set in the given context” cada vez que ejecute un CALLL a un stored procedure que deba retornar un set de datos.
Resumiendo, es, aparentemente un bug propio del uso de interfases programadas en PHP, tal como puede ser el caso de PhpMyAdmin y otras cosas similares. El problema estaría, aparentemente, en el problema qu etiene para interpretar la salida del SP como una tabla de datos, por cuanto la sentencia contenida en la ejecución no es un SELECT.

Este problema también aparece como bug en los foros de MySQL (Call to stored procedure can not return result set), donde sugieren que sucede al usar ODBC para las conexiones, y su solución sería
Cita:
Set CLIENT_MULTI_RESULTS or CLIENT_MULTI_STATEMENTS as default (or configurable) flags
when connecting to the datasource.
No te olvides que si estás usando PhpMyAdmin o Xampp, estás usando interfases que no interactúan directamente con la base, sino que lo hacen a través de un interprete.
Si estas tareas las hicieras en el modo consola de MySQL, el resultado sería otro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 22/10/2009 a las 15:43
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:04.