Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 

Repository files navigation

Proyecto Cajero ATM en PL/SQL

Descripción

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.

Funcionalidad Principal

  1. 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.
  2. 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, COMMIT y ROLLBACK para garantizar la atomicidad de las operaciones. Si el cajero no puede dar el cambio exacto, toda la operación se revierte al estado inicial.

Tecnología Utilizada

  • Base de Datos: Oracle Database (probado en 19c)
  • Lenguaje: PL/SQL

Estructura de la Base de Datos

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.

Documentación de Procedimientos

CREARCAJERO

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.

PCAJERO(CANTIDAD NUMBER, COMO VARCHAR2)

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 es cantidad-denominacion para 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 el CANTIDAD.
    • NO HAY CAMBIO: Si el cajero no tiene las monedas/billetes necesarios para devolver el cambio exacto.

Subprogramas Internos de PCAJERO

  • 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 tabla CAJERO.
  • 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 a TROCEAR para cada fragmento.
  • CAMBIO(PENDIENTE NUMBER): Calcula y ejecuta la devolución del cambio.

Cómo Ejecutar el Proyecto

  1. Conexión a la BD: Conéctate a tu base de datos Oracle con un cliente SQL (como SQL*Plus o SQL Developer).

  2. Activar Salida: Ejecuta SET SERVEROUTPUT ON para poder ver los mensajes del programa.

  3. Ejecutar el Script: Corre el script SOL_CAJERO.SQL completo. Esto creará la tabla, los procedimientos y ejecutará la inicialización del cajero.

  4. Realizar Transacciones: Llama al procedimiento PCAJERO con 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;

Conclusión y Aprendizajes

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, COMMIT y ROLLBACK es 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 CAMBIO utiliza 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.

About

Creacion de un Cajero ATM en PLSQL - 1ro de DAM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors