Está en la página 1de 30

PL/PGSQL

PL/PGSQL
Extensin "procedural" de SQL
6.2
Pero primero triggers
Pero primero triggers
DROP TABLE producto cascade;
CREATE TABLE producto( id int PR!AR" #E"$ %endido ti&esta&p';
DROP ()*CTO* &odi+icacion(' cascade;
CREATE ()*CTO* &odi+icacion(' RET)R*S TR,,ER AS -
BE,*
*E./%endido 01 --no2--;
RET)R* *E.;
E*D;
-LA*,)A,E -plp3s4l-;
DROP TR,,ER t5&odi+icacion on producto;
CREATE TR,,ER t5&odi+icacion BE(ORE *SERT O* producto
(OR EAC6 RO. E7EC)TE PROCED)RE &odi+icacion(';
*SERT into producto 8AL)ES (9';
SELECT : (RO! producto;
6.3
Tri33er La;out
CREATE TRIGGER
<trigger_name>
BEFORE
AFTER
INSERT
UPDATE
DELETE
OR
ON <table_name>
FOR EACH ROW
FOR EACH STATEMENT
EXECUTE PROCEDURE <function_name> ( ); <arguments>
OLD NEW
6.4
Extensiones SQL-99
Extensiones SQL-99
I
Entre las propuestas de+inidas en el est<ndar SQL=>>
est<n la extensin del SQL dot<ndolo de co&andos
para controlar el +lu?o0
#+$ 2@ere$ loop$ etc
I
El standard SQL=>> esta Aastante le?os de ser
satis+ec@o por la &a;orBa de las Aases de datos/
I
Oracle tiene una %ersin propia de estas extensiones
"procedurales" lla&ada PL/SQL
I
Post3reSQL tiene su %ersin lla&ada PL/pgSQL
6.5
Por qu PL/pgSQL
Por qu PL/pgSQL
I
Per&ite crear +unciones 4ue se e?ecutan en el
ser%idor (%ersus otras aproxi&aciones co&o CDBC
4ue se e?ecutan en el cliente con "o%er@ead" de
co&unicaciones'/
I
La propia Aase de datos se encar3a de co&pilar ;
3estionar estas +unciones con lo 4ue suelen ser
e+icientes/
I
proporciona0
#%ariaAles
#Aucles
#e%aluacin condicional
6.6
Un pso pre!io usr PL/pgSQL
Un pso pre!io usr PL/pgSQL
I
Cuando se crea una Aase de datos nue%a @ace +alta "autoriDar"
el uso de plEp3SQL (a &enos 4ue te&plate9 ;a este autoriDada'
create! "#ata!
create$a%& '$'&()$ "#ata!
I
En los laAoratorios deAerBa estar "autoriDado" por de+ecto
I
O?o0 no se co&prueAa la sintaxis de las +unciones @asta 4ue no
son e?ecutadas/ (Es di+Bcil depurar el cdi3o'
6."
PL/pgSQL# Estru$tur %e &s
PL/pgSQL# Estru$tur %e &s
'un$iones
'un$iones
I
PLEp3SQL presenta una estructura en "Blo4ues"/
I
Cada Alo4ue se de+ine usando
DECLARE
**+ar,a!$e( ,%,c,a$,-aa c.% NULL caa +e-
**)/e (e e%tra e% e$ !$.)/e
01112
BEGIN
**c."a%.(;
01112
END;
I
*o se pueden de+inir transacciones dentro de una +uncin
6.(
PL/pgSQL estru$tur
PL/pgSQL estru$tur
CREATE FUNCTION %."!re34/%c,5% (ar&/"e%t.()
RETURNS t#'e AS '
DECLARE
ec$arac,.%; **+ar,a!$e(
01112
BEGIN
(tate"e%t; **c."a%.(
01112
END;
' LANGUAGE 6'$'&()$6;
I
)na +uncin puede constar de %arios Alo4ues ; estos pueden
estar anidados
6.9
PL/pgSQL# Gener&i%%es
PL/pgSQL# Gener&i%%es
I
Los tipos de datos pasados a la +uncin se dan en parFntesis
(sin no&Are de %ariaAle antes de post3res G'
I
El cuerpo de la +uncin se pasa a la Aase de datos co&o una
cadena de caracteres (ntese$ 4ue el cuerpo e&pieDa ; acaAa
con co&illas si&ples' (escape doAle'
I
Tras la cadena el len3ua?e usado para crear la +uncin se de+ine
usando la orden "LA*,)ACE" (otros len3ua?es posiAles son
PLEPERL$ PLETCL$ C$ etc'
6.)*
E+emp&o tri!i& sin psr pr,metros
E+emp&o tri!i& sin psr pr,metros
I
HQuF @ace esta +uncinI
CREATE OR REPLACE FUNCTION /%a34/%c,.% () RETURNS
,%t7 AS
6 DECLARE
a%3,%te&er int4; **+ar,a!$e(
BEGIN
a%3,%te&er := 89 : 89; **c."a%.(
RETURN a%3,%te&er;
END;
6 LANGUAGE 6'$'&()$6;
3333333333333333333333333333
select una5+uncion(';
una5+uncion
============
9JJ
(9 ro2'
6.))
-ipos %e .ri/&es-0
-ipos %e .ri/&es-0
I
E?e&plos de %ariaAles0
,3/(/ar,. INTEGER;
ca%t,a NUMERIC(;<=);
/r$ >ARCHAR;
** Ma( (.!re $.( t,'.( (,&/,e%te( "?( ae$a%te
",ca"'. ",ta!$a1ca"'.@TAPE;
",t/'$a ",ta!$a@ROWTAPE;
I
T@e 3eneral s;ntax o+ a %ariaAle declaration is0
%a"e 0 CONSTANT 2 t#'e 0 NOT NULL 2 0 B DEFAULT C DE F
eG're((,.% 2;
6.)2
-ipos %e .ri/&es 00
-ipos %e .ri/&es 00
I
Todos los tipos de %ariaAle de+inidos para SQL son %<lidos en
PLEp3SQL
I
*o es i&prescindiAle conocer el tipo de %ariaAles de los atriAutos
# E?e&plos usando KT"PE
DECLARE H ",+ar 'a#r.$$1(a$ar,.@TAPE;
BEGIN H RETURN ",+ar:=;
# KRO.T"PE reser%a sitio para toda la tupla
# Reteniendo la estructura de los datos
DECLARE L &i%ar pa;rollKRO.T"PE;
BE,* L RET)R* &i%ar/salario:M;
6.)3
E+emp&o tri!i& psn%o !ri/&es
E+emp&o tri!i& psn%o !ri/&es
CREATE OR REPLACE FUNCTION ca$3$.%&,t/ (text)
RETURNS ,%t7 AS
6 DECLARE
intext ALIAS FOR $1; **'r,"er 'ara"etr.
re(/$ta. ,%t7;
BEGIN
re(/$ta. DE (SELECT LENGTH(,%teGt));
RETURN re(/$ta.;
END;
6 LANGUAGE 6'$'&()$6;
3333333333333333333333333333
SELECT cal5lon3itud(-42ert;-';
cal5lon3itud
==============
N
(9 ro2'
6.)4
1,s so/re .ri/&es
1,s so/re .ri/&es
I
CREATE ()*CTO* &i+uncion(*TE,ER$ C6AR$ L'
I
Se pueden pasar @asta 9N %ariaAles
# O9$ OM$ L$ O9N
I
ALAS per&ite reno&Arar %ariaAles
CREATE FUNCTION ca$3$.%&,t/ (text) RETURNS ,%t7
AS
6 DECLARE
intext ALIAS FOR $1; **'r,"er 'ara"etr.
re(/$ta. ,%t7;
1 1 1
6.)5
E+emp&o usn%o 2o3t4pe
E+emp&o usn%o 2o3t4pe
CREATE OR REPLACE FUNCTION trae3'e$,c/$a (,%te&er)
RETURNS teGt AS 6
DECLARE
'e$,c/$a3, ALIAS FOR I8;
e%c.%traa3'e$,c/$a 'e$,c/$a@ROWTAPE;
BEGIN
SELECT INTO e%c.%traa3'e$,c/$a : FROM 'e$,c/$a
WHERE , E 'e$,c/$a3,;
RETURN e%c.%traa3'e$,c/$a1t,t/$. CC 66 (66 CC
e%c.%traa3'e$,c/$a1a&%. CC 66)66;
END;
6 LANGUAGE 6'$'&()$6;
I
*ota0 Si SELECT *TO de%uel%e &<s de una tupla se i3noran
todas &enos la pri&era (la solucin a esto &<s tarde'
6.)6
E+er$i$io
E+er$i$io
I
En la Aase de datos de pelBculas crear dos +unciones 4ue nos
sir%an para llenar la taAla reparto$ dando el no&Are de la
pelicula ; el no&Are del actor
CREATE TABLE PELICULA(
ID INTEGER< ** Ie%t,4,ca.r J%,c.
TITULO CHAR(K9)< ** T,t/$. e $a 'e$Lc/$a
AGNO DECIMAL(7)< ** AM. e e(tre%.
PUNTUACION FLOAT< ** P/%t/ac,5% "e,a
>OTOS INTEGER< ** N/"er. e +.t.(
PRIMARA NEA (ID));
**
CREATE TABLE ACTOR (
ID INTEGER< ** Ie%t,4,ca.r O%,c.
NOMBRE CHAR(P;)< ** N."!re e$ act.rQactr,-
PRIMARA NEA (ID));
**
CREATE TABLE REPARTO(
PELICULA3ID INTEGER< ** re4ere%c,a a $a ta!$a PELICULA
ACTOR3ID INTEGER< ** re4ere%c,a a $a ta!$a ACTOR3ID
ORD INTEGER< ** Ore% e% e$ re'art.
** La e(tre$$a e( 8< 111
**
FOREIGN NEA (PELICULA3ID ) REFERENCES PELICULA(ID)<
FOREIGN NEA (ACTOR3ID) REFERENCES ACTOR(ID)<
PRIMARA NEA (PELICULA3ID< ACTOR3ID));
6.)"
5ontro& %e 6&u+o
5ontro& %e 6&u+o
I
Los pro3ra&as no suelen e?ecutarse de principio a +in sin
exceptuar nin3una lBnea de cdi3o/ PLEp3SQL contiene
estructuras de control 4ue per&iten seleccionar las lBneas de
cdi3o 4ue ser<n e?ecutarse en tie&po real/
I
(LT6E*LELSELELSE (
# e?ecucin condicional
I
LOOPS$ .6LE LOOPS$ (OR LOOPS
# iteraciones
# Aucles
6.)(
E+emp&o 06/ELSE
E+emp&o 06/ELSE
I
Pro3ra&a 4ue calcula la lon3itud de dos cadenas ; de%uel%e la
lon3itud &a;or/
CREATE OR REPLACE FUNCTION cae%a3"a(3$ar&a(teGt<
teGt) RETURNS ,%t7 AS 6
DECLARE
,%3/%. ALIAS FOR I8;
,%3.( ALIAS FOR I=;
$.%3/%. ,%t7;
$.%3.( ,%t7;
re(/$t ,%t7;
BEGIN
$.%3/%. DE (SELECT LENGTH(,%3/%.));
$.%3.( DE (SELECT LENGTH(,%3.());
IF $.%3/%. > $.%3.( THEN RETURN $.%3/%.;
ELSE RETURN $.%3.(;
END IF;
END;
6LANGUAGE 6'$'&()$6;
I
NOTA 8D (e '/ee% Racer c.%,c,.%e( "a(
c."'$,caa( /(a%. OR # AND
I
NOTA =D C.". PLQ'&SSL (e a&r/'a e% !$.)/e( %.
Race% 4a$ta 'arT%te(,( e% t.r%. a IF
6.)9
E+emp&o /u$&e 780LE
E+emp&o /u$&e 780LE 96:2; 96:2;
I
(uncin 4ue cuenta cuantas %eces aparece un car<cter en una cadena
CREATE OR REPLACE FUNCTION c/e%tac(teGt<teGt) RETURNS
INT7 AS 6
DECLARE
,%teGt ALIAS FOR I8; ,%cRar ALIAS FOR I=;
$.% ,%t7; re(/$ta. ,%t7;
, ,%t7; t"' cRar;
BEGIN
$.% DE $e%&tR(,%teGt)U8; ,DE8;
re(/$ta.DE9;
WHILE , <E $.% LOOP
t"' DE (/!(tr(,%teGt<,<8);
IF t"' E ,%cRar THEN
re(/$ta. DE re(/$ta. U8;
END IF;
,DE,U8;
END LOOP;
RETURN re(/$ta.;
END
6 LANGUAGE 6'$'&()$6;
** SELECT cuentac(-42ert;t4-$-4-';
6.2*
Ex$ep$iones
Ex$ep$iones
I
RASE se usa para i&pri&ir &ensa?es ;$ en el caso de
excepcion$ aAortar la transaccin
I
RASE P *OTCE Q E7CEPTO*R
I
RASE *OTCE
# RASE *OTCE - *o @a3as esoS- -;
# RASE *OTCE - -El seTor- - QQ id QQ - -no est< en casa- -;
# RASE *OTCE - -el seTor K no est< en casa- - $ id;
6.2)
Ex$ep$iones# E+emp&o
Ex$ep$iones# E+emp&o
I
Calcular la su&a de los enteros de n a & (usar la +or&ula (pU9':pEM
CREATE OR REPLACE FUNCTION (/"a(,%t7< ,%t7) RETURNS ,%t7 AS 6
DECLARE
,%,c,. ALIAS FOR I8; 4,% ALIAS FOR I=;
re(/$ta. ,%t;
BEGIN
IF (,%,c,. <8) THEN
RAISE EXCEPTION 66,%,c,. e!e (er "a#.r )/e 866;
ELSE
IF(,%,c,. <E 4,%) THEN
re(/$ta. DE (4,%U8):4,%Q= *
(,%,c,.*8):,%,c,.Q=;
ELSE
RAISE EXCEPTION 66E$ +a$.r ,%,c,a$ @ e!e (er "e%.r )/e e$
4,%a$ @66< ,%,c,.< 4,%;
END IF;
END IF;
RETURN re(/$ta.;
END
6 LANGUAGE 6'$'&()$6;
SELECT (/"a(8<P);
II
6.22
SELE5- 4 <u$&es
SELE5- 4 <u$&es
CREATE OR REPLACE FUNCTION trae3'e$,c/$a (,%te&er)
RETURNS teGt AS 6
DECLARE
'e$,c/$a3, ALIAS FOR I8;
e%c.%traa3'e$,c/$a 'e$,c/$a@ROWTAPE;
BEGIN
SELECT INTO e%c.%traa3'e$,c/$a : FROM 'e$,c/$a
WHERE , E 'e$,c/$a3,;
RETURN e%c.%traa3'e$,c/$a1t,t/$. CC 66 (66 CC
e%c.%traa3'e$,c/$a1a&%. CC 66)66;
I
*ota0 Si SELECT *TO de%uel%e &<s de una tupla se i3noran
todas &enos la pri&era (la solucin a esto &<s tarde'
6.23
SELE5- 4 <u$&es
SELE5- 4 <u$&es
I
Cuantas tuplas e&pieDan con una letra deter&inada
CREATE OR REPLACE FUNCTION c/e%ta3$etra (teGt) RETURNS ,%t7 AS
6
DECLARE
caracter ALIAS FOR I8; te"'.ra$ rec.r;
t"'3caracter teGt; re(/$ta. ,%t7;
BEGIN
re(/$ta.DE9;
FOR te"'.ra$ IN SELECT t,t/$. FROM 'e$,c/$a LOOP
t"'3caracter DE(/!(tr(te"'.ra$1t,t/$.<8<8);
IF t"'3caracter E caracter THEN
re(/$ta. DE re(/$ta. U8;
END IF;
END LOOP;
RETURN re(/$ta.;
END;
6LANGUAGE 6'$'&()$6;
SELECT c/e%ta3$etra(6A6);
6.24
Exa&en Parcial *o%
PE2S:=>
:<?E-:
PU?>
SuAastado por
Persona
Pu?a
Pu?a
OA?eto
V Rec@aDar pu?as no ad&isiAles
V 9JK &enos 4ue pu?a anterior
V )n dBa &<s tarde
V ActualiDar ca&pos redundantes
V %endido
6.25
-><L>S
-><L>S
CREATE TABLE persona(
id SERAL$ ==identi+icador unico
PR!AR" #E"(id'
';
CREATE TABLE oA?eto(
id SERAL$ ==identi+icador unico
persona5id *T$
+ec@a5salida T!ESTA!P DE(A)LT no2('$
%endido int DE(A)LT J$ == 9 %endido$ J no %endido
precio5salida *)!ERC(9J$M'$
PR!AR" #E"(id'$
(ORE,* #E" (persona5id' RE(ERE*CES persona(id'
';
CREATE TABLE pu?a(
oA?eto5id *T$
persona5id *T$
+ec@a T!ESTA!P$
cuantia *)!ERC(9J$M'$
(ORE,* #E" (oA?eto5id' RE(ERE*CES oA?eto(id'$
(ORE,* #E" (persona5id' RE(ERE*CES persona(id'$
PR!AR" #E"(persona5id$oA?eto5id$+ec@a'
';
6.26
@>-:S
@>-:S
==poAlar la taAla
==
==persona (id'
==
*SERT *TO persona 8AL)ES (9';==
*SERT *TO persona 8AL)ES (M';==
*SERT *TO persona 8AL)ES (W';==
*SERT *TO persona 8AL)ES (X';==
*SERT *TO persona 8AL)ES (Y';==
==
==oA?eto(id$ persona5id$+ec@a5salida$%endido$precio5salida'
==
*SERT *TO oA?eto 8AL)ES (9$9$no2('$DE(A)LT$MW';==
*SERT *TO oA?eto 8AL)ES (M$9$no2('U-=9/9 da;-$DE(A)LT$MW';
*SERT *TO oA?eto 8AL)ES (W$W$no2('U-=W/9X da;-$DE(A)LT$MW';
*SERT *TO oA?eto 8AL)ES (X$W$no2('U-=M/> da;-$DE(A)LT$MW';
*SERT *TO oA?eto 8AL)ES (Y$W$no2('U-=Y/> da;-$DE(A)LT$MW';
*SERT *TO oA?eto 8AL)ES (N$X$no2('U-=Y/> da;-$DE(A)LT$MW';
*SERT *TO oA?eto 8AL)ES (Z$X$no2('U-=J/> da;-$DE(A)LT$MW';
*SERT *TO oA?eto 8AL)ES (G$Y$no2('U-=J/G da;-$DE(A)LT$MW';
*SERT *TO oA?eto 8AL)ES (>$Y$no2('U-=9/WX da;-$DE(A)LT$MW';
*SERT *TO oA?eto 8AL)ES (9J$Y$no2('U-=Y/> da;-$DE(A)LT$MW';
==
==pu?a (oA?eto5id$persona5id$+ec@a'
==
*SERT *TO pu?a 8AL)ES (9$9$no2('U-9 @our-$9J/WX';
*SERT *TO pu?a 8AL)ES (9$9$no2('U-M @our-$9J/WX';
*SERT *TO pu?a 8AL)ES (9$9$no2('U-W @our-$9J/WX';
*SERT *TO pu?a 8AL)ES (9$9$no2('U-X @our-$9J/WX';
*SERT *TO pu?a 8AL)ES (9$9$no2('U-Y @our-$9J/WX';
*SERT *TO pu?a 8AL)ES (9$9$no2('U-9J @our-$9J/WX';
*SERT *TO pu?a 8AL)ES (9J$9$no2('U-9 @our-$9J/WX';
*SERT *TO pu?a 8AL)ES (>$9$no2('U-9 @our-$9J/WX';

E+emp&o 'un$iAn en 5
E+emp&o 'un$iAn en 5
6.2(
E+emp&o %e 6un$iAn en 5
E+emp&o %e 6un$iAn en 5
I
Cdi3o

V,%c$/e W'.(t&re(1RW
V,%c$/e <(tr,%&1R>
Q: !# +a$/e :Q

,%t a3.%e(,%t ar&)
B
ret/r% ar& U 8;
F
I
Co&pilacin
&cc *4',c *c 4..1c *I Q/(rQ,%c$/eQ'&()$Q(er+erQ
&cc *(Rare *. 4..1(. 4..1.
6.29
E+emp&o %e 6un$iAn en 5-00
E+emp&o %e 6un$iAn en 5-00
I
nstalacion0
# co&o istrador de la Aase (post3es'0
CREATE FUNCTION a3.%e(,%te&er) RETURNS ,%te&er
AS 6Qt"'Q4..1(.6< 6a3.%e6
LANGUAGE C STRICT;
3333333333333333333333333333333
I
a3.%e1(. es la liArerBa din<&ica con la +uncin
I
!<s in+or&acin en0
Rtt'DQQe+e$.'er1'.(t&re()$1.r&Q.c(Q'.(t&re(QG4/%c*c1Rt"$
I
Rec.rar )/e C %. (.'.rta t..( $.( t,'.( /(a.(
e% SSL (# +,ce+er(a)

Se $/A
Se $/A

También podría gustarte