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

[SOLUCIONADO] Procedimiento almacenado transacción de banco

Estas en el tema de Procedimiento almacenado transacción de banco en el foro de Mysql en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original CREATE PROCEDURE ( P_NUMERO_CUENTA INT , P_MONTO_RETIRO INT -- COMO SERA DECIMAL EN MYSQL ) BEGIN DECLARE OBTENER_SALDO INT ...
  #1 (permalink)  
Antiguo 11/11/2014, 07:59
 
Fecha de Ingreso: noviembre-2014
Ubicación: peru-lima
Mensajes: 32
Antigüedad: 9 años, 5 meses
Puntos: 2
Pregunta Procedimiento almacenado transacción de banco

Código MySQL:
Ver original
  1. P_NUMERO_CUENTA INT,
  2. P_MONTO_RETIRO INT -- COMO SERA DECIMAL EN MYSQL
  3. )
  4. DECLARE OBTENER_SALDO INT;
  5. DECLARE NUEVO_SALDO INT;
  6. SET OBTENER_SALDO = SELECT SALDO FROM CUENTA WHERE NUMERO_CUENTA = P_NUMERO_CUENTA
  7. IF OBTENER_SALDO >= P_MONTO_RETIRO THEN
  8. SET NUEVO_SALDO = OBTENER_SALDO - P_MONTO_RETIRO
  9. UPDATE CUENTA SET SALDO = NUEVO_SALDO WHERE NUMERO_CUENTA = P_NUMERO_CUENTA
  10. INSERT INTO MOVIMIENTOS VALUES (NUMERO_CUENTA,SALDO,SALDO_ACTUAL,SALDO_RETIRO)
  11. (P_NUMERO_CUENTA,OBTENER_SALDO,NUEVO_SALDO,P_MONTO_RETIRO)
GRACIAS

Última edición por gnzsoloyo; 11/11/2014 a las 08:08
  #2 (permalink)  
Antiguo 11/11/2014, 08:09
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, 4 meses
Puntos: 2658
Respuesta: Procedimiento almacenado transacción de banco

Y la pregunta sería... ¿cuál?

Lo siento, pero no hay funciones telepáticas en el foro. Si no nos cuentas qué problema tienes será imposible ayudarte.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 11/11/2014, 08:35
 
Fecha de Ingreso: noviembre-2014
Ubicación: peru-lima
Mensajes: 32
Antigüedad: 9 años, 5 meses
Puntos: 2
Respuesta: Procedimiento almacenado transacción de banco

Me olvide - tan emocionado por mi primer tema...
Sale error en el código en la parte de declare
utilizo wampserver...

Última edición por ut261c; 11/11/2014 a las 08:40
  #4 (permalink)  
Antiguo 11/11/2014, 09:05
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, 4 meses
Puntos: 2658
Respuesta: Procedimiento almacenado transacción de banco

Tienes varios erroes:
1) WAMP Server no es con lo que ejecutas esto, sino por medio de la pestaña "SQL" de phpMyadmin.
2) Para ejecutar la creación de SP en phpMyadmin, debe indicarse el delimitador de sentencias transitorio, en un textoBox, algo mas abajo del panel de edicion de las sentencias.
3) El delimitador debe cambiarse por otro paracter o conjuto de caracteres que no puedan ser confundidos. El manual sugiere usar "$$".
4) Todas las sentencias en MySQL terminan en ";". Todas.
5) Un "SET variable = SELECT... " generará un error sintáctico, es conveniente poner el SELECT entre paréntesis, o bien usar
Código SQL:
Ver original
  1. SELECT... FROM ... WHERRE ... INTO variable
6) Todo bloque IF... THEN ... END IF se cierra también con ";", pero solo despues del END IF.
7) Un INSERT múltiple se compone con conjuntos de VALUES entre parentesis, separados por comas. Eso es de manual basico porque se usa en todos los DBMS.

Sería mas o menos así:
Código MySQL:
Ver original
  1.   P_NUMERO_CUENTA INT,
  2.   P_MONTO_RETIRO DECIMAL(14,2) -- Leer el manual de referencia por favor, estas cosas se aprenden alli.
  3. )
  4.   DECLARE OBTENER_SALDO INT;
  5.   DECLARE NUEVO_SALDO INT;
  6.   SET OBTENER_SALDO = (SELECT SALDO FROM CUENTA WHERE NUMERO_CUENTA = P_NUMERO_CUENTA);
  7.   IF OBTENER_SALDO >= P_MONTO_RETIRO THEN
  8.         SET NUEVO_SALDO = OBTENER_SALDO - P_MONTO_RETIRO
  9.         UPDATE CUENTA SET SALDO = NUEVO_SALDO
  10.         WHERE NUMERO_CUENTA = P_NUMERO_CUENTA;
  11.         INSERT INTO MOVIMIENTOS
  12.         VALUES (NUMERO_CUENTA, SALDO, SALDO_ACTUAL, SALDO_RETIRO), (P_NUMERO_CUENTA,OBTENER_SALDO,NUEVO_SALDO,P_MONTO_RETIRO);
  13. END$$
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 11/11/2014, 10:21
 
Fecha de Ingreso: noviembre-2014
Ubicación: peru-lima
Mensajes: 32
Antigüedad: 9 años, 5 meses
Puntos: 2
Respuesta: Procedimiento almacenado transacción de banco

NO SALIO


MySQL ha dicho:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 6


...CON QUE PROGRAMA HACES MYSQL PARA DESCARGAR...
  #6 (permalink)  
Antiguo 11/11/2014, 10:41
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, 4 meses
Puntos: 2658
Respuesta: Procedimiento almacenado transacción de banco

No salió porque hiciste un Copy+Paste...

Mira con cuidado el código, y podrás ver el error de sintaxis muy, pero muy visible, en la línea 10. Como ya te dije, toda sentencia debe cerrarse con un ";"...
Código MySQL:
Ver original
  1.   P_NUMERO_CUENTA INT,
  2.   P_MONTO_RETIRO DECIMAL(14,2) -- Leer el manual de referencia por favor, estas cosas se aprenden alli.
  3. )
  4.   DECLARE OBTENER_SALDO INT;
  5.   DECLARE NUEVO_SALDO INT;
  6.   SET OBTENER_SALDO = (SELECT SALDO FROM CUENTA WHERE NUMERO_CUENTA = P_NUMERO_CUENTA);
  7.   IF OBTENER_SALDO >= P_MONTO_RETIRO THEN
  8.  
  9.         SET NUEVO_SALDO = OBTENER_SALDO - P_MONTO_RETIRO; -- Esta no estaba cerrada.
  10.  
  11.         UPDATE CUENTA SET SALDO = NUEVO_SALDO
  12.         WHERE NUMERO_CUENTA = P_NUMERO_CUENTA;
  13.  
  14.         INSERT INTO MOVIMIENTOS
  15.         VALUES (NUMERO_CUENTA, SALDO, SALDO_ACTUAL, SALDO_RETIRO),  
  16.                 (P_NUMERO_CUENTA,OBTENER_SALDO,NUEVO_SALDO,P_MONTO_RETIRO);
  17.   END IF;
  18. END$$

Mi sugerencia es que todo código de SQL lo desarrolles con el MySQL Workbench.
__________________
¿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; 11/11/2014 a las 11:17
  #7 (permalink)  
Antiguo 11/11/2014, 12:59
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Procedimiento almacenado transacción de banco

Hola ut261c:

Además de lo que comenta gnzsoloyo, creo que muchos de tus problemas es por NO LLAMAS A LAS COSAS POR SU NOMBRE...

Ojo con eso.

Saludos
Leo
  #8 (permalink)  
Antiguo 16/11/2014, 06:54
 
Fecha de Ingreso: noviembre-2014
Ubicación: peru-lima
Mensajes: 32
Antigüedad: 9 años, 5 meses
Puntos: 2
Respuesta: Procedimiento almacenado transacción de banco

SOLUCIÓN AL ERROR DE LA LINEA DE DECLARE, END IF.
Código SQL:
Ver original
  1. delimiter --NECESARIO PARA CREAR VARIABLES Y QUE NO SALGA ERROR EN END IF. NO ES NECESARIO PONER &&,$$,//
  2. CREATE PROCEDURE p_retiro(
  3. r_num_cue INT,
  4. r_sal_ret DECIMAL(13,2)
  5. )
  6. BEGIN
  7. DECLARE obt_num_cue INT;
  8. DECLARE obt_sal_ini DECIMAL(13,2);
  9. DECLARE res_sal DECIMAL(13,2);
  10. SET obt_num_cue = (SELECT numero_cuenta FROM cuenta WHERE numero_cuenta = r_num_cue);
  11. SET obt_sal_ini = (SELECT saldo FROM cuenta WHERE numero_cuenta = r_num_cue);
  12. IF (obt_sal_ini >= r_sal_ret) THEN
  13. SET res_sal = obt_sal_ini - r_sal_ret;
  14. INSERT INTO retiro VALUES
  15. (r_num_cue,r_sal_ret);
  16. UPDATE cuenta SET saldo = res_sal WHERE numero_cuenta = r_num_cue;
  17. INSERT INTO movimientos VALUES
  18. (r_num_cue,obt_sal_ini,res_sal,r_sal_ret);
  19. END IF;
  20. END -- NO SE DEBE ACABAR CON -- && , $$ , //

--- GRACIAS POR LAS RESPUESTAS ---

Última edición por gnzsoloyo; 16/11/2014 a las 08:10

Etiquetas: banco
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 10:28.