En general, la cantidad de parámetros que un stored procedure recibe o devuelve es una cantidad fija. Por ejemplo, este stored procedure recibe dos parámetros:

CREATE PROCEDURE SP1(
   tcParametro1 VARCHAR(512),
   tnParametro2 INTEGER)

cuyos nombres son tcParametro1 y tnParametro2. Esto funciona muy bien, pero requiere que conozcamos de antemano la cantidad de parámetros y el tipo de cada uno de ellos. Pero a veces eso no sucede porque recién en tiempo de ejecución podemos conocer la cantidad de parámetros. ¿Cómo lo resolvemos en ese caso?

La técnica es enviar todos los parámetros en un string y separar cada uno de esos parámetros con un delimitador. El delimitador puede ser cualquier caracter (o conjunto de caracteres) que estamos seguros que no se encontrarán entre los datos. Por ejemplo, sería un error usar como delimitador a la letra A si dentro de los datos hay nombres de personas porque muchas personas tienen nombres que contienen a la letra A. Hay que elegir un caracter que nunca puede estar contenido entre los datos, por ejemplo: ^, &, %, $, etc.

Una vez que hemos elegido un delimitador que estamos segurísimos que nunca puede estar incluido entre los datos, enviamos todos los datos que queremos, separados por ese delimitador.

Ejemplo:

Tenemos una tabla llamada PRODUCTOS que tiene estos datos:

VARIABLES1

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

y queremos consultar los nombres de los productos cuyos identificadores son 10, 15 y 20. Para eso escribimos el siguiente stored procedure:

CREATE PROCEDURE NOMBRES_PRODUCTOS(
   tcIdentificadores VARCHAR(512))
RETURNS(
   tcNombre TYPE OF COLUMN PRODUCTOS.PRD_NOMBRE)
AS
BEGIN

   FOR SELECT
      PRD_NOMBRE
   FROM
      PRODUCTOS
   WHERE
      :tcIdentificadores CONTAINING '^' || PRD_IDENTI || '^'
   INTO
      :tcNombre
   DO
      SUSPEND;

END;

En este ejemplo nuestro delimitador es el acento circunflejo (^).

Llamamos a este stored procedure seleccionable de la siguiente forma:

SELECT * FROM NOMBRES_PRODUCTOS('^10^15^20^');

Y este es el resultado que obtenemos:

VARIABLES2

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

Y ahora los que nos interesan son los nombres de los productos cuyos identificadores son 10, 12, 14, 16, 18, 20, así que invocamos al mismo stored procedure de esta forma:

SELECT * FROM NOMBRES_PRODUCTOS('^10^12^14^16^18^20^');

Y esto es lo que obtenemos:

VARIABLES3

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

O sea que escribimos un solo stored procedure pero nos puede devolver los nombres de 3 productos, de 6 productos, o de la cantidad de productos que se nos ocurra.

Conclusión:

Poder enviar (o recibir) una cantidad variable de parámetros puede ser muy útil en las ocasiones en las cuales la cantidad de parámetros enviados o recibidos solamente podemos conocer en tiempo de ejecución. De esta manera escribimos un solo stored procedure el cual a veces recibe (o devuelve) un parámetro, a veces dos parámetros, a veces tres parámetros, etc., los que necesitemos.

Artículos relacionados:

Enviando y recibiendo una cantidad variable de parámetros en los stored procedures

El índice del blog Firebird21

El foro del blog Firebird21