Ver Mensaje Individual
  #6 (permalink)  
Antiguo 25/11/2010, 10:25
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: 16 años, 5 meses
Puntos: 2658
Respuesta: retornar un valor desde un procedure

Vamos por partes:
- RETURN pertenece a un STORED FUNCION, no a un STORED PROCEDURE. Tienen una sintaxis similar, pero grandes diferencias: Una función almacenada sólo puede devolver un único dato y de un sólo tipo, el cual se debe declarar en el prototipo. Además todos los parámetros de una SF son IN.

- Si vas a devolver más de un tipo de datos, sólo puedes usar SP, pero con PHP solamente puedes leer el result de la ejecución, por lo que deberás estructurar las respuestas posibles y resolverlo en el código del script. Mi sugerencia es que uses valores numéricos para obtener las respuestas y la resolución de los mensajes la hagas en el PHP.

Algo así:
Código MySQL:
Ver original
  1. -- --------------------------------------------------------------------------------
  2. -- Routine DDL
  3. -- --------------------------------------------------------------------------------
  4. DELIMITER $$
  5.  
  6. CREATE PROCEDURE `PA_Arribos`(
  7.     xop int, xidEmpTransport int,
  8.     xDireccion varchar(150),
  9.     xnumVuelo int,
  10.     xfechaLlegada date,
  11.     xHoraLlegada time ,
  12.     xnumPersonas int,
  13.     OUT xidArribo int)
  14.     CASE xop
  15.         WHEN 1 THEN
  16.             INSERT INTO arribos(idArribos, idEmpTransporte,Direccion,NumVuelo, FechaLlegada, HoraLlegada, NumPersonas)
  17.             VALUES(xidArribo, xidEmpTransport,xDireccion,xnumVuelo,xfechaLlegada, xHoraLlegada, xnumPersonas);
  18.             SET xidArribo  = LAST_INSERT_ID();
  19.             SELECT xidArribo;
  20.         WHEN 2 THEN
  21.              SELECT idEmpleado from cliente where idEmpleado = 1;
  22.         ELSE
  23.              SELECT 'Operacion no Contemplada' Mensaje;
  24.     END CASE;

Prestale atención a un par de cosas:
1) No debes usar DECLARE para declarar variables que tengan el mismo nombre que las que ya vienen en el prototipo. Es un error. Las variables del prototipo ya existen y pueden ser usadas en cualquier parte del codigo del SP.

2) Si el numero de registro es autogenerado, no tiene ninguna utilidad, y puede ser impreciso, usar MAX(x)+1 para obtener el siguiente, porque el siguiente puede no ser ese. El auto_increment se controla de otra forma y el próximo ID autogenerado mysql lo obtiene sobre la base de otra metodología. Por eso precisamente existe la función LAST_INSERT_ID(). Si esta devuelve cero, es que no se insertó nada, caso contrario devuelve el valor real del ID generado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)