<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=DAI-C8-EC%3A_Programaci%C3%B3_PL%2FpgSQL</id>
	<title>DAI-C8-EC: Programació PL/pgSQL - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=DAI-C8-EC%3A_Programaci%C3%B3_PL%2FpgSQL"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=DAI-C8-EC:_Programaci%C3%B3_PL/pgSQL&amp;action=history"/>
	<updated>2026-08-30T07:13:07Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=DAI-C8-EC:_Programaci%C3%B3_PL/pgSQL&amp;diff=3828&amp;oldid=prev</id>
		<title>Joan: /* Desenvolupament */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=DAI-C8-EC:_Programaci%C3%B3_PL/pgSQL&amp;diff=3828&amp;oldid=prev"/>
		<updated>2009-11-03T14:52:13Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Desenvolupament&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Objectius==&lt;br /&gt;
Unitat Didàctica: UD 7. Programació PL/pgSQL&lt;br /&gt;
&lt;br /&gt;
Assentament dels conceptes i sintaxi de PL/pgSQL.&lt;br /&gt;
&lt;br /&gt;
==Desenvolupament==&lt;br /&gt;
Farem un projecte sobre la base de dades d'un restaurant.&lt;br /&gt;
&lt;br /&gt;
En principi treballaràs en local, tot i que també hi hauria la possibilitat de treballar contra el servidor PostgreSQL de l'institut (192.168.0.10).&lt;br /&gt;
&lt;br /&gt;
El primer que has de fer és crear la base de dades ''restaurant'', i crear un usuari per a aquesta base de dades que no sigui l'usuari administratiu:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ psql -h localhost -p 5432 -U postgres postgres&lt;br /&gt;
postgres# CREATE DATABASE restaurant ENCODING 'UTF-8';&lt;br /&gt;
postgres=# CREATE USER profe WITH ENCRYPTED PASSWORD 'profe';&lt;br /&gt;
postgres=# grant all privileges on database restaurant to profe;&lt;br /&gt;
postgres=# \q&lt;br /&gt;
&lt;br /&gt;
$ psql -h localhost -p 5432 -U profe restaurant&lt;br /&gt;
restaurant#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Encara ens falta una cosa, crear el llenguatge plpgsql per a aquesta base de dades. Això ho ha de fer el propietari de la base de dades ''restaurant'', que és l'usuari ''postgres'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ psql -h localhost -p 5432 -U postgres restaurant&lt;br /&gt;
restaurant=# CREATE language plpgsql;&lt;br /&gt;
CREATE LANGUAGE&lt;br /&gt;
restaurant=# \q&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Se't proporciona el script per crear l'estructura de la base de dades:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- projecte restaurant&lt;br /&gt;
-- IES Jaume Balmes&lt;br /&gt;
&lt;br /&gt;
-- les taules amb què treballaràs són:&lt;br /&gt;
-- TAULA(id_taula,taula,zona)&lt;br /&gt;
-- CAMBRER(id_cambrer,nom)&lt;br /&gt;
-- CARTA(id_plat,plat,tipus,preu)&lt;br /&gt;
-- SERVEI(id_servei,id_cambrer,id_taula,dia_hora,preu)&lt;br /&gt;
-- DETALL_SERVEI(id_servei,id_plat,quantitat)&lt;br /&gt;
&lt;br /&gt;
DROP SEQUENCE seq_servei;&lt;br /&gt;
&lt;br /&gt;
DROP TABLE DETALL_SERVEI;&lt;br /&gt;
DROP TABLE SERVEI;&lt;br /&gt;
DROP TABLE CARTA;&lt;br /&gt;
DROP TABLE CAMBRER;&lt;br /&gt;
DROP TABLE TAULA;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE TAULA(&lt;br /&gt;
id_taula INTEGER PRIMARY KEY,&lt;br /&gt;
taula CHAR(3),&lt;br /&gt;
zona CHAR(1) CHECK (zona IN ('A','B','C','D'))&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE CAMBRER(&lt;br /&gt;
id_cambrer INTEGER PRIMARY KEY,&lt;br /&gt;
nom VARCHAR(10)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE CARTA(&lt;br /&gt;
id_plat INTEGER PRIMARY KEY,&lt;br /&gt;
plat VARCHAR(20),&lt;br /&gt;
tipus CHAR(1) CHECK (tipus IN ('E','P','S','D','B')),&lt;br /&gt;
preu NUMERIC(4,2)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE SERVEI(&lt;br /&gt;
id_servei INTEGER PRIMARY KEY,&lt;br /&gt;
id_cambrer INTEGER REFERENCES CAMBRER,&lt;br /&gt;
id_taula INTEGER REFERENCES TAULA,&lt;br /&gt;
dia_hora TIMESTAMP,&lt;br /&gt;
preu NUMERIC(4,2)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE SEQUENCE seq_servei START 1;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE DETALL_SERVEI(&lt;br /&gt;
id_servei INTEGER REFERENCES SERVEI,&lt;br /&gt;
id_plat INTEGER REFERENCES CARTA,&lt;br /&gt;
quantitat INTEGER,&lt;br /&gt;
PRIMARY KEY(id_servei,id_plat)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(1,'T1','A');&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(2,'T2','A');&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(3,'T3','A');&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(4,'T4','B');&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(5,'T5','B');&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(6,'T6','B');&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(7,'T7','C');&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(8,'T8','C');&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(9,'T9','D');&lt;br /&gt;
INSERT INTO TAULA(id_taula,taula,zona) VALUES(10,'T10','D');&lt;br /&gt;
&lt;br /&gt;
INSERT INTO CAMBRER(id_cambrer,nom) VALUES(1,'Pere');&lt;br /&gt;
INSERT INTO CAMBRER(id_cambrer,nom) VALUES(2,'Maria');&lt;br /&gt;
INSERT INTO CAMBRER(id_cambrer,nom) VALUES(3,'Tomàs');&lt;br /&gt;
&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(1,'Amanida catalana','E',4.25);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(2,'Amanida Russa','E',5.5);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(3,'Meló amb pernil','E',6);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(4,'Paella','P',7);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(5,'Crema de carbassó','P',3.5);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(6,'Sopa de peix','P',6.5);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(7,'Sopa aranesa','P',8);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(8,'Torrades escalivada','P',5);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(9,'Verduretes de l''hort','P',5.5);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(10,'Pollastre farcit','S',8.5);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(11,'Peus de porc','S',7);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(12,'Bistec tàrtar','S',8);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(13,'Vedella amb bolets','S',8.5);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(14,'Lluç a la Biscaïna','S',10);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(15,'Mousse de xocolata','D',3);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(16,'Plat de músic','D',2);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(17,'Mel i metó','D',2.5);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(18,'Fruita del temps','D',1);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(19,'Vi Negre','B',5);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(20,'Vi Blanc','B',6);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(21,'Aigua mineral','B',2);&lt;br /&gt;
INSERT INTO CARTA(id_plat,plat,tipus,preu) VALUES(22,'Cervesa','B',2.5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per executar aquest script, crees el fitxer restaurant.sql i executes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
restaurant# \i restaurant.sql&lt;br /&gt;
o bé&lt;br /&gt;
restaurant# \i restaurant.sql \g arxiu_XX.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
També es pot executar des del prompt del sistema:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ psql -h localhost -U postgres restaurant &amp;lt; script.sql &amp;gt; fitxer.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
veiem els ERROR i els NOTICE en la pantalla, i en el fitxer.log hi ha les sentències correctes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ psql -h localhost -U postgres restaurant &amp;lt; script.sql &amp;gt; fitxer.log 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
no veiem res a la pantalla: tota la sortida s'envia a fitxer.log, tant sentències correctes com incorrectes&lt;br /&gt;
&lt;br /&gt;
Un cop tens creada l'estructura i has estudiat els lligams que hi ha entre les taules, ja pots crear els següents procediments que se't demana:&lt;br /&gt;
&lt;br /&gt;
Crear els següents procediments:&lt;br /&gt;
&lt;br /&gt;
*''inserir_servei(id_cambrer,id_taula)'': ha d'inserir un registre en la taula servei, amb la data del sistema. El preu es deixa NULL  (es calcularà a posteriori). El valor id_servei s'agafa a partir de la seqüència corresponent. És el procediment que s'executa quan el cambrer comença a prendre nota a una taula.&lt;br /&gt;
*''inserir_detall_servei(id_servei,id_plat,quantitat)'': insereix un registre en la taula DETALL_SERVEI. És el procediment que s'executa quan el cambrer pren nota de què menjaran els comensals.&lt;br /&gt;
*''calcular_servei(id_servei)'': s'executa quan hem de generar el ticket, per saber quan ha de pagar la taula pel servei. S'ha de fer un UPDATE de SERVEI.preu&lt;br /&gt;
*''mostra_servei(id_servei)'': mostrar tots els plats que s'han de servir en un servei. Mostra la taula i el cambrer.&lt;br /&gt;
*''resum_cambrer(id_cambrer,dia)'': mostrar un informe de tots els serveis que ha fet un cambrer en un dia. Informar de què ha facturat a cada servei, i el total del dia.&lt;br /&gt;
*''informe_mensual(mes)'': per al mes indicat, fer un informe del que han facturat tots els cambrers, ordenats de major a menor.&lt;br /&gt;
&lt;br /&gt;
Per a cadascun dels procediments, hauràs de fer un joc de proves. Com sempre, els jocs de proves han de ser significatius i han de contemplar les diferents situacions que es poden donar. Integra tot aquest codi dins del script restaurant.sql, i sigues generós amb els comentaris.&lt;br /&gt;
&lt;br /&gt;
Aquests procediments seran la base per crear una aplicació PHP que treballarà contra Postgres, Oracle i MySQL,&lt;br /&gt;
&lt;br /&gt;
==Entrega==&lt;br /&gt;
* entregar els fitxers DAI2AXX_restaurant_NA13.sql i DAI2AXX_NA13.log. Si has treballat per parelles: DAI2AXXXX_script_NA12.sql i DAI2AXXXX_NA12.log, indicant a dins clarament el nom i el número de classe. Exercici individual o per parelles.&lt;br /&gt;
* entregar al Moodle: http://192.168.0.15/moodle&lt;br /&gt;
&lt;br /&gt;
==Recursos==&lt;br /&gt;
* Teoria: [[Teoria_PL/pgSQL]]&lt;br /&gt;
* També pots trobar la teoria en el Moodle en format pdf.&lt;br /&gt;
* El professor penjarà la solució dels exercicis en el Moodle, a posteriori.&lt;br /&gt;
* Solució: [[Imatge:Solucio procediments postgres.sql.zip]]&lt;br /&gt;
&lt;br /&gt;
==Durarda==&lt;br /&gt;
4 hores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, octubre 2009&lt;br /&gt;
[[Categoria: IES Jaume Balmes]]&lt;br /&gt;
[[Categoria: Pràctiques DAI-C8-EC]]&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>