
























Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Este documento ofrece información detallada sobre procedimientos almacenados en PL/pgSQL para bases de datos PostgreSQL. Aprende cómo crear, utilizar y gestionar procedimientos almacenados, incluyendo sentencias condicionales, bucles, variables y tipos de retorno. Además, se incluyen ejemplos prácticos para clarificar conceptos.
Tipo: Apuntes
1 / 32
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!

























4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
Les sentències de PL/pgSQL les utilitzarem dins del cos d’unprocediment, és a dir, entre les sentències CREATE FUNCTIONi END de la funció.
Bàsicament, PL/pgSQL proporciona dos tipus de sentències:
-^
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
SETOF tipus AS $$
ciutat_client;
plpgsql;
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
CREATE FUNCTION exemple_retorn_n_tuples(max integer)RETURNS SETOF integer
i integer := 0;
i:=i+1;RETURN NEXT i;EXIT WHEN i = max;
END LOOP;RETURN; END;$$LANGUAGE
plpgsql;
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
^
Bàsicament, és possible utilitzar variables dins d’un procediment emmagatzemat en lessituacions següents:
En sentències SQL
-^
En sentències de PL/PGSQL per
Assignar-hi valors
-^
Calcular valors
-^
CREATE FUNCTION....DECLARE Controlar el flux d’execució d’un procediment
dni_client clients.dni%TYPE;ciutat_client varchar(15);
....SELECT ciutat INTO ciutat_clientFROM clientsWHERE dni=dni_client;...
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
CREATE TYPE tipusAdressa AS (
carrer varchar(20),num_carrer varchar(4),ciutat varchar (15));
CREATE FUNCTION exNousTipus()RETURNS tipusAdressa AS $$DECLARE
adressa tipusAdressa;carrer varchar(20);
....adressa.ciutat:='Badalona';....carrer := adressa.carrer;....
RETURN adressa;END;$$ LANGUAGE plpgsql;
En alguns casos, com per exemple quan un procediment ha deretornar tuples amb un conjunt d’atributs ens cal definir un nou tipus.
Utilització i accésdels diferents valorsde la variable
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL Només té sentit per sentències o procediments que només retornen una fila:
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
La sentència IF serveix per a establir condicions en el fluxd’execució d’un procediment:
condició
bloc de sentències
bloc de sentències
END IF
Podem establir diferents nivells d’aniuament mitjançant la clàusula
Condicions:
Operadors lògics: AND, OR, NOT
-^
Operadors de comparació: =, <,<=, >, >=, etc
-^
Predicats propis d’SQL: BETWEEN, IN, IS NULL, EXISTS
-^
Variable PL/pgSQL: FOUND
-^
Consultes SQL
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
La variable FOUND és de tipus booleà.FOUND té en principi el valor False.El seu valor pot canviar quan s’executen les sentències següents:• Una sentència SELECT ... INTO posa FOUND a True si el select obté unafila, i a False si no s’obté cap fila.• Una sentència UPDATE, INSERT o DELETE posa FOUND a True si com amínim una fila es veu afectada per la sentència, i a False si no quedaafectada cap fila.• Una sentència FOR. Dintre de cada iteració del FOR, el valor de la variablepot canviar segons les sentències que s’hi executen. Però en sortir del FORés posa FOUND a True si s’ha iterat una o més vegades, sinó es posa aFalse.FOUND és una variable local en un procediment. Qualsevol canvi enaquesta variable afecta només al procediment on aquest canvi es produeix.
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
CREATE FUNCTION calcul_desc_client(dni_client clients.dni%type)RETURNS integer AS $$DECLARE
descompte INTEGER;qttComClient INTEGER;
BEGIN
SELECT qtt_com into qttComclient FROM clients WHERE
dni=dni_client;
IF (qttComclient=0)
THEN descompte:=0;
ELSIF (qttComClient<5)
THEN descompte:=1;
ELSIF (qttComClient<10) THEN descompte:=3;ELSIF (qttComClient<15) THEN descompte:=5;ELSE
descompte:=10;
END IF;RETURN descompte; END;$$LANGUAGE
plpgsql;
Execució de la funció:
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
dni_client VARCHAR(9),nom_client VARCHAR(15),cognom1 VARCHAR(15),pref CHAR(1));
CREATE FUNCTION clients_ciutat_tip(ciutat_client clients.ciutat%type)RETURNS SETOF Tdades_client_tip AS $$DECLARE
dades_clients
Tdades_client_tip;
dades_clients
IN SELECT dni,nom,cognom
FROM clientsWHERE ciutat=ciutat_client LOOP
dades_clients.pref := es_preferent(dades_clients.dni_client);return next dades_clients; END
plpgsql;
Obté les dades de tots els clients d’una determinada ciutat. Indica amb una “P”els clients que són preferents (import total de comandes superior a 60000).
Procediment que comprovasi un client és preferent
4.1 Laboratori - Procediments emmagatzemats en PL/PGSQL
CREATE FUNCTION import_totes_com(dni_client
clients.dni%type)
RETURNS void AS $$DECLARE
num_comanda comandes.num_com%type;import comandes.import_total%type; BEGINFOR
num_comanda IN SELECT num_com FROM comandes
WHERE dni=dni_client
LOOPSELECT SUM(ic.quantitat*i.preu_unitat) INTO import
FROM items_comanda ic, items iWHERE i.num_item=ic.num_item
AND ic.num_com=num_comanda;
UPDATE comandes
SET import_total=importWHERE num_com=num_comanda;
plpgsql;
Modifica l’import de la comanda a la taula comandes per cadascuna deles comandes d’un determinat client.