Ver Mensaje Individual
  #5 (permalink)  
Antiguo 29/09/2008, 08:35
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: Ayuda porfavor!

Desde ya te digo que ese código es absolutamente inservible para MySQL, por lo que ni intentes usarlo, por al menos estas cosas:
1. Un store procedure no admite más que un bloque BEGIN ... END, ya que ese bloque indica desde donde inicia y dónde termina el cuerpo completo del código del SP y ninguna otra cosa. Los demás condicionales internos son otros.
2. No existe PRINT dentro de las fucniones y/sentencias de MySQL. Si lo que quieres es una respuesta en un valor existen dos formas:
a) Te lo devuelve e un una variable de entrada, para lo cual debe ser declarada en el prototipo como de salida.
b) te lo devuelve e un campo único, para lo cual se debe invocar un SELECT "Texto de salida", caso en el cual la respuesta del SP es un campo único.
3. El @ se usa en MySQL para crear variables globales, no locales. De hecho, el @ es para usar y crear variables globales dinámicas, por lo que las que lo usan no necesitan ser declaradas en el SP. Simplemente se usan.
4. Las variables de entrada no deben llevar el nombre de los campos, eso procudirá errores de almacenamiento. Tampoco deben iniciar con un "_", porque pueden confundirse con variables de sistema.
5. Las sentencias terminan con un ";". TODAS, menos los condicionales.
6. Si el SP se ingresará por consola, debe incluirse un cambio transitorio de fin de sentencia con DELIMITER para que almacene en el buffer todo el cuerpo de un solo saque y luego volver a cambiarlo por el inicial. En ese caso, el delimitador de sentencias cambiado va sólo en el END del cuerpo y luego el DELIMITER,como verás en el ejemplo.
7. SI la carga se realiza por código de programación (PHP, VB.NET u otro), se carga en un sólo string sin cambios de delimitador.
El cuerpo del SP, usando variables de salida sería mas o menos así:

Código sql:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE sp_insertarEmpleado(
  3. IN Vusuario VARCHAR(20),
  4. IN Vpassword VARCHAR(20),
  5. IN Vrut VARCHAR(8),
  6. IN Vdigito VARCHAR(1),
  7. IN Vnombre VARCHAR(20),
  8. IN Vape_pat VARCHAR(30),
  9. IN Vape_mat VARCHAR(30),
  10. IN Vtipo VARCHAR(5)
  11. OUT salida VARCHAR(20))
  12. AS
  13. BEGIN
  14. IF rut = '' OR rut IS NULL THEN
  15. SET salida = 'error, debe ingresar RUT';
  16. ELSE
  17. INSERT INTO empleado VALUES(rut,digito,nombre,ape_pat,ape_mat,tip o)
  18. INSERT INTO usuario VALUES(Vusuario,Vpassword,Vrut,Vdigito,Vestado,Vti po);
  19. END IF
  20. END $$
  21.  
  22. DELIMITER ;

Con devolución de valor en el SP:
Código sql:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE sp_insertarEmpleado(
  3. IN Vusuario VARCHAR(20),
  4. IN Vpassword VARCHAR(20),
  5. IN Vrut VARCHAR(8),
  6. IN Vdigito VARCHAR(1),
  7. IN Vnombre VARCHAR(20),
  8. IN Vape_pat VARCHAR(30),
  9. IN Vape_mat VARCHAR(30),
  10. IN Vtipo VARCHAR(5))
  11. AS
  12. BEGIN
  13. IF rut = '' OR rut IS NULL THEN
  14. SELECT 'Error, debe ingresar RUT';
  15. ELSE
  16. INSERT INTO empleado VALUES(rut,digito,nombre,ape_pat,ape_mat,tip o)
  17. INSERT INTO usuario VALUES(Vusuario,Vpassword,Vrut,Vdigito,Vestado,Vti po);
  18. END IF
  19. END $$
  20.  
  21. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)