En este tema, aprenderemos sobre el manejo de cursores en COBOL cuando trabajamos con bases de datos. Los cursores son una herramienta esencial para manejar conjuntos de resultados de consultas SQL de manera eficiente. A través de este módulo, cubriremos los conceptos básicos de los cursores, cómo declararlos, abrirlos, usarlos para recuperar datos y cerrarlos.

Conceptos Básicos de Cursores

Un cursor es un mecanismo que permite recorrer fila por fila un conjunto de resultados de una consulta SQL. Los cursores son útiles cuando necesitas procesar cada fila individualmente en lugar de trabajar con el conjunto completo de resultados a la vez.

Tipos de Cursores

  1. Cursores Estáticos: Capturan un conjunto de resultados en el momento en que se abre el cursor y no reflejan cambios posteriores en la base de datos.
  2. Cursores Dinámicos: Reflejan los cambios en la base de datos mientras se recorren las filas.
  3. Cursores de Solo Adelante: Permiten moverse solo hacia adelante a través del conjunto de resultados.

Declaración de Cursores

Para usar un cursor en COBOL, primero debes declararlo en la sección de SQL embebido. Aquí hay un ejemplo básico de cómo declarar un cursor:

EXEC SQL
    DECLARE cursor_name CURSOR FOR
    SELECT column1, column2
    FROM table_name
    WHERE condition
END-EXEC.

Ejemplo

EXEC SQL
    DECLARE employee_cursor CURSOR FOR
    SELECT emp_id, emp_name, emp_salary
    FROM employees
    WHERE emp_department = 'IT'
END-EXEC.

Apertura de Cursores

Después de declarar un cursor, debes abrirlo para ejecutar la consulta y preparar el conjunto de resultados.

EXEC SQL
    OPEN cursor_name
END-EXEC.

Ejemplo

EXEC SQL
    OPEN employee_cursor
END-EXEC.

Recuperación de Datos

Para recuperar datos de un cursor, utilizamos la sentencia FETCH. Esto mueve el cursor a la siguiente fila del conjunto de resultados y copia los valores de las columnas en las variables COBOL.

EXEC SQL
    FETCH cursor_name INTO :variable1, :variable2
END-EXEC.

Ejemplo

EXEC SQL
    FETCH employee_cursor INTO :emp-id, :emp-name, :emp-salary
END-EXEC.

Cierre de Cursores

Una vez que hayas terminado de usar un cursor, debes cerrarlo para liberar los recursos asociados.

EXEC SQL
    CLOSE cursor_name
END-EXEC.

Ejemplo

EXEC SQL
    CLOSE employee_cursor
END-EXEC.

Ejemplo Completo

A continuación, se muestra un ejemplo completo que incluye la declaración, apertura, recuperación de datos y cierre de un cursor.

IDENTIFICATION DIVISION.
PROGRAM-ID. CursorExample.

DATA DIVISION.
WORKING-STORAGE SECTION.
01  EMP-ID      PIC 9(5).
01  EMP-NAME    PIC X(20).
01  EMP-SALARY  PIC 9(7)V99.

PROCEDURE DIVISION.
    EXEC SQL
        DECLARE employee_cursor CURSOR FOR
        SELECT emp_id, emp_name, emp_salary
        FROM employees
        WHERE emp_department = 'IT'
    END-EXEC.

    EXEC SQL
        OPEN employee_cursor
    END-EXEC.

    PERFORM UNTIL SQLCODE NOT = 0
        EXEC SQL
            FETCH employee_cursor INTO :EMP-ID, :EMP-NAME, :EMP-SALARY
        END-EXEC

        IF SQLCODE = 0
            DISPLAY 'Employee ID: ' EMP-ID
            DISPLAY 'Employee Name: ' EMP-NAME
            DISPLAY 'Employee Salary: ' EMP-SALARY
        END-IF
    END-PERFORM.

    EXEC SQL
        CLOSE employee_cursor
    END-EXEC.

    STOP RUN.

Ejercicio Práctico

Ejercicio

  1. Declara un cursor para seleccionar todos los productos de una tabla products donde el category sea 'Electronics'.
  2. Abre el cursor y recupera los datos de cada producto.
  3. Muestra el product_id, product_name y price de cada producto.
  4. Cierra el cursor al finalizar.

Solución

IDENTIFICATION DIVISION.
PROGRAM-ID. ProductCursorExample.

DATA DIVISION.
WORKING-STORAGE SECTION.
01  PRODUCT-ID    PIC 9(5).
01  PRODUCT-NAME  PIC X(30).
01  PRICE         PIC 9(5)V99.

PROCEDURE DIVISION.
    EXEC SQL
        DECLARE product_cursor CURSOR FOR
        SELECT product_id, product_name, price
        FROM products
        WHERE category = 'Electronics'
    END-EXEC.

    EXEC SQL
        OPEN product_cursor
    END-EXEC.

    PERFORM UNTIL SQLCODE NOT = 0
        EXEC SQL
            FETCH product_cursor INTO :PRODUCT-ID, :PRODUCT-NAME, :PRICE
        END-EXEC

        IF SQLCODE = 0
            DISPLAY 'Product ID: ' PRODUCT-ID
            DISPLAY 'Product Name: ' PRODUCT-NAME
            DISPLAY 'Price: ' PRICE
        END-IF
    END-PERFORM.

    EXEC SQL
        CLOSE product_cursor
    END-EXEC.

    STOP RUN.

Conclusión

En este tema, hemos aprendido cómo manejar cursores en COBOL para trabajar con conjuntos de resultados de consultas SQL. Hemos cubierto la declaración, apertura, recuperación de datos y cierre de cursores, y hemos visto un ejemplo completo y un ejercicio práctico para reforzar los conceptos. Con esta base, estarás preparado para manejar conjuntos de datos más complejos y realizar operaciones detalladas en tus programas COBOL.

© Copyright 2024. Todos los derechos reservados