[Pgsql-ayuda] ejemplos de Pl/PgSql

Alvaro Herrera alvherre@dcc.uchile.cl
Wed, 12 Nov 2003 11:50:48 -0300


On Tue, Nov 11, 2003 at 11:24:33PM -0600, Gunnar Wolf wrote:
> Alvaro Herrera dijo [Wed, Nov 12, 2003 at 01:39:36AM -0300]:

> > Hagamos un almacén de ejemplos ... yo tengo varios, algunos tontos,
> > otros ilegibles, que pueden servir de guía.
> 
> Me parece muy bonita idea... ¿En postgresql.cl, o sugieres algún otro
> lugar? ¿Algo tipo Wiki podría ser? 

Hum, sí, quizás un Wiki sea buena idea... cualquier otra cosa va a
significar que "alguien" haga un script o algo, y no va a salir jamás.
Si alguien quiere poner un espacio en web con algún wiki podríamos
partir pronto.

Voy a partir mal, con un ejemplo trivial que no es plpgsql sino plperl.
(Quizás deberíamos hacer una categoría por cada lenguaje ...)

CREATE OR REPLACE FUNCTION overlaps
        (integer, integer, integer, integer) RETURNS boolean AS '
	$a1 = shift; $a2 = shift;
	$b1 = shift; $b2 = shift;
	($al, $au) = $a1 > $a2 ? ($a2, $a1) : ($a1, $a2);
	($bl, $bu) = $b1 > $b2 ? ($b2, $b1) : ($b1, $b2);
	return ''f'' if ($bl > $au);
	return ''f'' if ($bu < $al);
	return ''t'';
' STRICT IMMUTABLE LANGUAGE plperl;

Esto recibe dos intervalos de enteros y devuelve si traslapan o no.
Recibe un par que representa el primer intervalo y otro par que
representa el segundo intervalo (pueden venir bien ordenados o no).

regression=> select overlaps(1,2,3,4), overlaps (1,5,2,3), overlaps(5,1,10,2);
 overlaps | overlaps | overlaps
----------+----------+----------
 f        | t        | t
(1 fila)

-------->-------->-------->-------->-------->-------->-------->-------->
Otro ejemplo, en SQL.  Esto sólo funciona en 7.4:

create function max(anyelement, anyelement) returns anyelement as '
select case when $1 > $2 then $1 else $2 end' language sql strict immutable;

Retorna el mayor de los dos argumentos, que pueden ser de cualquier
tipo (compatibles entre sí obviamente).

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"Oh, great altar of passive entertainment, bestow upon me thy discordant images
at such speed as to render linear thought impossible" (Calvin a la TV)