Usando parámetros para devolver la cantidad de filas

1 comentario

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

Anuncios

Multiple rows in singleton select

Deja un comentario

Este mensaje de error traducido significa: “hay muchas filas en el SELECT y debería haber solamente una”

Y ocurre cuando el Firebird está esperando que un SELECT devuelva una y solamente una fila pero el SELECT está devolviendo más de una fila.

Ejemplo:

UPDATE
   MiTabla
SET
   MiColumna = (SELECT MiOtraColumna FROM MiOtraTabla WHERE MiCondición)

¿Cuál es la solución?

El problema está en el SELECT entonces es allí donde se debe solucionar. Lo más sencillo es ejecutar solamente ese SELECT, ver cual es el conjunto resultado que devuelve y modificar el SELECT para que solamente devuelva una fila.

Para que un SELECT devuelva una fila y solamente una fila tenemos varias alternativas:

  1. Cambiar la condición MiCondición
  2. Usar FIRST 1
  3. Usar ROWS 1
  4. Usar DISTINCT

Conclusión:

El error ocurre cuando un SELECT devuelve más de una fila y debería devolver solamente una fila. La solución es revisar el SELECT para comprobar que es lo que devuelve y luego modificarlo para que devuelva solamente una fila.

Artículo relacionado:

El índice del blog Firebird21