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:
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:
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:
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
ejgtuc
Mar 03, 2017 @ 19:29:09
Hola Walter, cual es la cantidad maxima de parametros que puede recibir un stored procedure?. Vfp recibe 24, firebird ?. Gracias
Rodrigo Bedoya
Jul 09, 2019 @ 12:24:48
Como hago para devolver muchas columnas en n filas
SELECT A.*,B.* FROM TABLA A LEFT JOIN TABLA B ON A.LLAVE1=B.LLAVE2
wrov
Jul 09, 2019 @ 16:07:01
Hola
La cantidad de filas del conjunto resultado puedes determinar con la cláusula ROWS. Ejemplo:
Te devolverá las 5 primeras filas. También puedes especificar desde cual fila y hasta cual fila quieres. Por ejemplo:
Te devolverá las filas 6, 7, 8, 9, y 10.
Saludos.
Walter.