Como recordarás, cuando queremos limitar la cantidad de filas que devuelve un SELECT podemos usar la cláusula FIRST … SKIP o la cláusula ROWS. Cuando escribimos un stored procedure a veces no conocemos de antemano cuantas filas necesitaremos, o en otras palabras la cantidad de filas que devolverá el stored procedure es variable.

Entonces, ¿cómo lo solucionamos?

Rodeando a nuestra variable con paréntesis, como en los siguientes ejemplos:

Ejemplo 1:

CREATE PROCEDURE CANTIDAD_VARIABLE_1(
   tnCantidadFilas INTEGER)
RETURNS(
   ftcNombreCliente TYPE OF COLUMN CLIENTES.CLI_NOMBRE)
AS
BEGIN

   FOR SELECT
      FIRST (:tnCantidadFilas)
      CLI_NOMBRE
   FROM
      CLIENTES
   INTO
      :ftcNombreCliente
   DO BEGIN
      SUSPEND;
   END

END;

Ejecutamos a nuestro stored procedure así:

SELECT
   *
FROM
   CANTIDAD_VARIABLE_1(3)

Ejemplo 2:

CREATE PROCEDURE CANTIDAD_VARIABLE_2(
   tnCantidadFilas INTEGER)
RETURNS(
   ftcNombreCliente TYPE OF COLUMN CLIENTES.CLI_NOMBRE)
AS
BEGIN

   FOR SELECT
      CLI_NOMBRE
   FROM
      CLIENTES
   ROWS
      (:tnCantidadFilas)
   INTO
      :ftcNombreCliente
   DO BEGIN
      SUSPEND;
   END

END;

Ahora, ejecutamos a este stored procedure así:

SELECT
   *
FROM
   CANTIDAD_VARIABLE_2(3)

Resultados:

En ambos casos obtendremos algo similar a esto: CANTIDADVARIABLE1

Captura 1. Si haces clic en la imagen la verás más grande

Conclusión:

Si en un stored procedure queremos usar las cláusulas FIRST o ROWS y el valor que vendrá a continuación es una variable entonces deberemos rodearla con paréntesis, como se vio en los ejemplos anteriores, o sea que la sintaxis es:

FIRST (:MiVariable)

ROWS (:MiVariable)

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21