Ver Mensaje Individual
  #6 (permalink)  
Antiguo 05/01/2010, 05:45
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: procedimiento no puede devolver un conjunto de resultados en el contexto d

Cita:
Bueno no entiendo mucho, lo que crei entender era que el problema a cual se debia el error era por LAST_INSERT_ID() porque toma el ultimo valor de una tabla autoincrement, sin distinguir entre ellas, entonces suponiendo que si tengo dos tablas autoincrement y una es mas baja que la otra y quiero el valor de la mas baja, no me conbiene. Por eso hize esta consulta que hace li mismo:

SET idVenta = (SELECT Idventas FROM ventas ORDER BY Idventas desc LIMIT 1);-
En esto hay que atenerse a lo que los manuales explican: LAST_ISERT_ID() Devuelve el ID autoincremental que se ingresó en la última sentencia de inserción. Si se trató de de una inserción múltiple, sólo devuelve el valor de la primera inserción y no la última.
Se trata de una función muy eficiente, y que es mucho mejor que el ejemplo que das, porque en tu ejemplo, para encontrar ese valor debe leerse toda la tabla y ordenarse en forma decreciente . Te comento que el ordenamiento es una de las operaciones de mayor consumo de recursos en una base de datos, luego de los productos cartesianos.
Además, piénsalo así: ¿Para qué hacer una lectura de tabla, si una función me devuelve el valor buscado?
Lo que debes recordar es que ese valor no es permanente: Cambia con la siguiente inserción, por lo que la toma del dato debe ser inmediata a la ejecución (por eso la cambié de lugar).

Cita:
Bien en cuanto a la sita no entiendo muy bien, porque si yo llamo a la misma funcion tal cual la tengo desde el query browser de mysql me funciona a la perfeccion, el problema radica al llamarlo desde php.
Esto me parece que no lo habías mencionado, y es el corazón de tu problema.
Te has encontrado con un BUG de PHP (ver: Bug #42548. PROCEDURE xxx can't return a result set in the given context (works in 5.2.3!!))
Aparentemente podría resolverse usando PHP 5.2.3, o cualquier versión de PHP posterior al 01/01/2008.
El problema se originaría porque un SP que retorne un set (tabla) es tomado por PHP como un multi_query, por lo que no puede ejecutarlo dada la configuración que el servidor de PHP tiene.
¿Solución? Saca el SELECT fuera del SP y ejecútalo con otra consulta a continuación (la simpleza por sobre todo).

Cita:
y no entiendo mas cuando dice esto: Esto incluye comandos SELECT que no usan INTO hasta ahora no e usado select con un into dentro. ¿A que se refiere?
A que la forma eficiente y estandarizada de poner valores obtenidos en un select dentro de variables es usando la cláusula INTO, tal y como te lo puse en el ejemplo:
Código MySQL:
Ver original
  1. SELECT MAX(Idventas) INTO idVenta FROM ventas ;

Tip final: El uso de una función MAX() es más eficiente que lo que haces tu, pero menos que usar simplemente LAST_INSERT_ID().
__________________
¿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; 05/01/2010 a las 12:28