Este proyecto implementa la lógica de un cajero automático (ATM) utilizando PL/SQL en una base de datos Oracle. El sistema es capaz de gestionar un inventario de monedas y billetes, procesar pagos, calcular el cambio correcto y manejar transacciones de forma segura.
El cajero se inicializa con una cantidad predefinida de cada tipo de moneda/billete y puede aceptar dinero de un usuario para pagar una cantidad específica. Si el dinero entregado es mayor que el monto a pagar, el sistema calcula el cambio óptimo utilizando las denominaciones disponibles.
- Inicialización del Cajero (
CREARCAJERO): Un procedimiento puebla la base de datos con todas las denominaciones de dinero (desde 0.01 hasta 500) y establece una cantidad inicial (100 unidades) para cada una. - Procesamiento de Transacciones (
PCAJERO): Este es el procedimiento principal que simula una operación en el cajero.- Entrada de Dinero: Acepta una cadena de texto que representa las monedas/billetes que el usuario introduce (ej:
'1-10#2-20'significa una moneda de 10 y dos de 20). - Cálculo del Total: Suma el valor total del dinero introducido.
- Validación del Pago:
- Si el monto introducido es igual al precio, la transacción se completa.
- Si el monto es insuficiente, la transacción se anula.
- Si el monto es superior, calcula el cambio a devolver.
- Algoritmo de Cambio (
CAMBIO): Utiliza un algoritmo "greedy" (voraz) para dar el cambio. Comienza con la denominación más alta disponible y va entregando la cantidad necesaria hasta completar el total del cambio. - Control de Transacciones: Utiliza
SAVEPOINT,COMMITyROLLBACKpara garantizar la atomicidad de las operaciones. Si el cajero no puede dar el cambio exacto, toda la operación se revierte al estado inicial.
- Entrada de Dinero: Acepta una cadena de texto que representa las monedas/billetes que el usuario introduce (ej:
- Base de Datos: Oracle Database (probado en 19c)
- Lenguaje: PL/SQL
El sistema utiliza una única tabla para gestionar el efectivo:
CAJERO:MONEDA(NUMBER, PRIMARY KEY): El valor de la denominación (ej: 50, 20, 1, 0.50).CANTIDAD(NUMBER): La cantidad de unidades disponibles de esa denominación.
Procedimiento para inicializar o rellenar el cajero. No requiere parámetros.
EXEC CREARCAJERO;Crea 15 denominaciones diferentes (de 0.01 a 500) y las inicializa con 100 unidades cada una.
Es el procedimiento principal para realizar una operación de pago.
-
Parámetros:
CANTIDAD(NUMBER): El precio o monto que se debe pagar.COMO(VARCHAR2): Una cadena de texto que describe el dinero que el usuario introduce. El formato escantidad-denominacionpara cada tipo de moneda, separadas por el carácter#.
-
Ejemplo de uso: Pagar 5.50 introduciendo una moneda de 10.
-- Pagar 5.50, el usuario entrega una moneda de 10 EXECUTE PCAJERO(5.5, '1-10#');
-
Salida: El procedimiento mostrará un mensaje en la consola (
DBMS_OUTPUT) indicando el resultado:OPERACION REALIZADA CON EXITO: Si el pago y el cambio se completaron.PRECIO EXACTO: Si el usuario pagó la cantidad justa.NO HAY SUFICIENTE DINERO: Si el dinero introducido no cubre elCANTIDAD.NO HAY CAMBIO: Si el cajero no tiene las monedas/billetes necesarios para devolver el cambio exacto.
ISNATURAL(N NUMBER): Función que valida si un número es un entero no negativo.ISMONEDA(N NUMBER): Función que comprueba si una denominación de moneda existe en la tablaCAJERO.TROCEAR(CADENITA VARCHAR2): Procesa un fragmento de la cadena de entrada (ej:'1-10') y actualiza el inventario del cajero.PTABLAS(LITERAL VARCHAR2): Divide la cadena de entrada completa por el separador#y llama aTROCEARpara cada fragmento.CAMBIO(PENDIENTE NUMBER): Calcula y ejecuta la devolución del cambio.
-
Conexión a la BD: Conéctate a tu base de datos Oracle con un cliente SQL (como SQL*Plus o SQL Developer).
-
Activar Salida: Ejecuta
SET SERVEROUTPUT ONpara poder ver los mensajes del programa. -
Ejecutar el Script: Corre el script
SOL_CAJERO.SQLcompleto. Esto creará la tabla, los procedimientos y ejecutará la inicialización del cajero. -
Realizar Transacciones: Llama al procedimiento
PCAJEROcon los parámetros que desees para probar la funcionalidad.-- Ejemplo: Pagar 12.75, entregando un billete de 20. EXECUTE PCAJERO(12.75, '1-20#'); -- Verificar el estado del cajero después de la transacción SELECT * FROM CAJERO ORDER BY MONEDA DESC;
Este proyecto no es solo una simulación de un cajero automático, sino también una excelente demostración práctica de varios conceptos clave de Oracle y PL/SQL:
- Lógica Transaccional Robusta: El uso de
SAVEPOINT,COMMITyROLLBACKes fundamental y muestra cómo garantizar la atomicidad de las operaciones, un requisito indispensable en sistemas financieros. O la operación se completa con éxito, o la base de datos vuelve a su estado inicial sin cambios parciales. - Programación Modular en PL/SQL: La división del problema en procedimientos y funciones más pequeñas (
CAMBIO,PTABLAS,TROCEAR) hace que el código sea más legible, mantenible y fácil de depurar. - Manejo de Datos con Cursores: El procedimiento
CAMBIOutiliza un cursor para iterar sobre las denominaciones de manera ordenada, demostrando un patrón de acceso a datos eficiente y controlado. - Procesamiento de Cadenas de Texto: La capacidad de analizar una cadena de entrada con un formato personalizado (
'cantidad-moneda#...') es una habilidad útil para integrar sistemas o procesar datos no estructurados. - Implementación de Algoritmos: El proyecto implementa un algoritmo voraz (greedy) para el cálculo del cambio, un buen ejemplo de cómo la lógica algorítmica se traduce en código funcional.
En resumen, SOL_CAJERO.SQL es un caso de estudio compacto pero completo sobre cómo construir una aplicación lógica y segura directamente en la base de datos.