2010-03-02 24 views
5

Estoy usando una plataforma (formas perfectas) que me obliga a usar procedimientos almacenados para la mayoría de mis consultas, y nunca he usado procedimientos almacenados, no puedo entender lo que estoy haciendo mal La siguiente declaración se ejecuta sin errores:MySQL Stored Procedures no funciona con SELECT (pregunta básica)

DELIMITER // 
DROP PROCEDURE IF EXISTS test_db.test_proc// 
CREATE PROCEDURE test_db.test_proc() SELECT 'foo'; // 
DELIMITER ; 

Pero cuando intento llamarlo usando:

CALL test_proc(); 

me sale el siguiente error:

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

Estoy ejecutando estas declaraciones desde dentro phpmyadmin 3.2.4, PHP Version 5.2.12 y la versión del servidor mysql es 5.0.89-community.

Cuando escribo un procedimiento almacenado que devuelve un parámetro, y luego seleccionarla, las cosas funcionan bien (por ejemplo):

DELIMITER // 
DROP PROCEDURE IF EXISTS test_db.get_sum// 
CREATE PROCEDURE test_db.get_sum(out total int) 
BEGIN 
SELECT SUM(field1) INTO total FROM test_db.test_table; 
END // 
DELIMITER ; 

funciona bien, y cuando me llaman:

CALL get_sum(@t); SELECT @t; 

Me sale la suma no hay problema.

En última instancia, lo que tengo que hacer es tener una declaración SELECT envuelta en un procedimiento almacenado, así puedo llamarlo y devolver varias filas de múltiples campos. Por ahora estoy tratando de obtener cualquier seleccione trabajando.

Cualquier ayuda es muy apreciada.

+0

Cuando dice 'CALL myproc();' Supongo que quiere decir 'CALL test_proc();'? – Atli

+0

Sí, lo siento, era un tipo-o. ¿Hay alguna manera de editarlo? – TMG

+0

Sí, creo que debería poder editar sus propias publicaciones. (Debería ser un enlace de edición en algún lugar.) – Atli

Respuesta

9

Lo descubrí. Esto no es un error con PHP (aunque solía serlo), es un error en algunas versiones de phpmyadmin. El mismo bug intermitente reaparece y luego se fija en varias subversiones (véase arriba):

#1312 - PROCEDURE [name] can't return a result set in the given context 

Este comportamiento parece estar limitada a instrucciones SELECT dentro de los procedimientos almacenados dentro phpmyadmin.

El uso de un cliente como MySQL Workbench soluciona el problema (o puede actualizar phpmyadmin, pero eso es un problema si está en un servidor compartido como yo).

De todos modos, gracias a todos por su ayuda.

+1

"Resolvió" el problema para mí también, es decir, puedo reproducir el error usando phpmyadmin, y no aparece en el cliente CLI de mysql, ni en la aplicación PHP en sí. – tdammers

+0

@tdammers - hola gracias por la validación. A veces, cuando todos los programadores inteligentes de esta placa me dicen que estoy loco, empiezo a pensar que sí. – TMG

1

Compruebe su versión de php para ver si se trata de un error notificado (consulte here).

Ver este post: Can't return a result set in the given context

+1

Vi esa publicación. Mi versión de PHP es la versión de PHP 5.2.12, que supuestamente aparece antes de que aparezca ese error. – TMG

0

Cuando ejecuto el siguiente:

DELIMITER // 
DROP PROCEDURE IF EXISTS test_db.test_proc// 
CREATE PROCEDURE test_db.test_proc() SELECT 'foo'; // 
DELIMITER ; 

Seguido por

CALL test_db.test_proc(); 

que me muestra un conjunto de resultados como:

+-----+ 
| foo | 
+-----+ 
| foo | 
+-----+ 

Estoy usando PHP 5.3.1, MySQL 5.1.41 con phpMyAdmin 3.2.4.

¿Tal vez ha escrito mal el nombre de su procedimiento?
¿O podría haber un problema con sus instalaciones PHP o MySQL? (Tal vez un error. ¿Ha intentado actualizar a las últimas versiones?)

+0

Revisé los nombres. Lo probé en otro servidor local. Este ejecuta PHP Version 5.2.9, MySQL 5.1.33-community y phpmyadmin 3.1.3.1. De acuerdo con los informes de errores, esa configuración no debería tener un problema. Sin embargo, sigue siendo el mismo error: # 1312 - PROCEDIMIENTO test_db.test_proc no puede devolver un conjunto de resultados en el contexto dado – TMG

1

Esto probablemente se centra en un error relacionado con PHP y SELECT dentro de un procedimiento/rutina almacenados. Una posible solución alternativa es utilizar SELECT... INTO dentro del procedimiento almacenado para llevar el resultado a una variable. Esto funcionó en algunos other cases que leí.

SELECT * FROM category INTO c;