10
Muy a menudo hacemos queries usando select … where id in (…), por ejemplo:
SELECT id,nombre FROM ejemplo_select_in WHERE edad IN (20,25,50);
Esto es distinto cuando lo queremos hacer en un Store Procedure (SP), y queremos usar un arreglo como parámetro, ya que no usamos la clausula IN, veamos como hacerlo.
Usemos la siguiente tabla para el ejemplo:
|
id
|
nombre
|
edad
|
|
1
|
nombre 1 |
20
|
|
2
|
nombre 2 |
20
|
|
3
|
nombre 3 |
20
|
|
7
|
nombre 7 |
25
|
|
4
|
nombre 4 |
50
|
|
5
|
nombre 5 |
50
|
|
6
|
nombre 6 |
25
|
ejemplo:
Si quisieramos obtener los que tengan 20 años haríamos un SP de la siguiente manera: (el ejemplo es trivial pero práctico)
CREATE OR REPLACE FUNCTION sp_get_personas(_edad INTEGER) RETURNS SETOF type_select_in AS
$BODY$
DECLARE
retval record;
BEGIN
FOR retval IN
SELECT * FROM ejemplo_select_in WHERE edad = _edad LOOP
RETURN NEXT retval;
END LOOP ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Al ejecutar SELECT * FROM sp_get_personas(25) obtendríamos:
|
id
|
nombre
|
edad
|
|
7
|
nombre 7 |
25
|
|
6
|
nombre 6 |
25
|
Para poder obtener aquellos que tengan 20 y 25 años cambiaríamos el SP y en vez de usar select in usaríamos la función ANY():
CREATE OR REPLACE FUNCTION sp_get_personas(_edad INTEGER[]) RETURNS SETOF type_select_in AS
$BODY$
DECLARE
retval record;
BEGIN
FOR retval IN
SELECT * FROM ejemplo_select_in WHERE edad = ANY(_edad) LOOP
RETURN NEXT retval;
END LOOP ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Al ejecutar SELECT * FROM sp_get_personas(25,50) obtendríamos:
|
id
|
nombre
|
edad
|
|
7
|
nombre 7 |
25
|
|
4
|
nombre 4 |
50
|
|
5
|
nombre 5 |
50
|
|
6
|
nombre 6 |
25
|
La función ANY(), no es de uso común y en estos casos es la mejor opción.
Les dejo con los Scripts .
Espero que les sirva, Hasta la próxima!.
Deja un comentario