En este artículo ya habíamos visto como usar cursores, y lo útiles que pueden ser:

https://firebird21.wordpress.com/2013/06/02/usando-cursores/

Ahora veremos un ejemplo donde el cursor tiene condiciones que vienen como parámetros de entrada del stored procedure.

CREATE PROCEDURE CURSOR_1(
   tnCodSuc TYPE OF COLUMN CLIENTES.CLI_CODSUC,
   tnIdent1 TYPE OF COLUMN CLIENTES.CLI_IDENTI,
   tnIdent2 TYPE OF COLUMN CLIENTES.CLI_IDENTI)
   RETURNS(
      ftnIdenti INTEGER,
      ftcNombre VARCHAR(40))
AS
   DECLARE VARIABLE lcContinuar CHAR(1);
   DECLARE VARIABLE MiCursor CURSOR FOR (
                                         SELECT
                                            CLI_IDENTI,
                                            CLI_NOMBRE
                                         FROM
                                            CLIENTES
                                         WHERE
                                            CLI_CODSUC = :tnCodSuc AND
                                            CLI_IDENTI BETWEEN :tnIdent1 AND :tnIdent2);
BEGIN

   OPEN MiCursor; /* Se abre el cursor */

   lcContinuar = 'S';

   WHILE (lcContinuar = 'S') DO BEGIN
      FETCH                             /* extrae una fila */
         MiCursor
      INTO
         :ftnIdenti,
         :ftcNombre;
      IF (ROW_COUNT = 1) THEN BEGIN     /* si ROW_COUNT = 1, se leyó una fila */
         /* Aquí se puede realizar algún proceso con los datos */
         SUSPEND;
      END ELSE
         lcContinuar = 'N';             /* Si ROW_COUNT = 0, ya no hay más filas */
   END

   CLOSE MiCursor; /* Se cierra el cursor */

END;

Como puedes ver, este stored procedure tiene 3 parámetros de entrada:

  • el código de la Sucursal
  • el identificador del primer cliente que nos interesa
  • el identificador del último cliente que nos interesa

y por lo tanto en el cursor tendremos los datos de los clientes que pertenecen a esa sucursal y cuyos identificadores están dentro del rango.

Artículos relacionados:

Usando cursores

El índice del blog Firebird21