<?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=Pr%C3%A0ctica_ASI-C6-ASGBD%3A_Oracle%3A_Pr%C3%A0ctica_PL%2FSQL</id>
	<title>Pràctica ASI-C6-ASGBD: Oracle: Pràctica PL/SQL - 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=Pr%C3%A0ctica_ASI-C6-ASGBD%3A_Oracle%3A_Pr%C3%A0ctica_PL%2FSQL"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Pr%C3%A0ctica_ASI-C6-ASGBD:_Oracle:_Pr%C3%A0ctica_PL/SQL&amp;action=history"/>
	<updated>2026-08-30T09:10:38Z</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=Pr%C3%A0ctica_ASI-C6-ASGBD:_Oracle:_Pr%C3%A0ctica_PL/SQL&amp;diff=35859&amp;oldid=prev</id>
		<title>Joan a 16:18, 29 nov 2010</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Pr%C3%A0ctica_ASI-C6-ASGBD:_Oracle:_Pr%C3%A0ctica_PL/SQL&amp;diff=35859&amp;oldid=prev"/>
		<updated>2010-11-29T16:18:08Z</updated>

		<summary type="html">&lt;p&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 1. Introducció a Oracle&lt;br /&gt;
&lt;br /&gt;
El llenguatge PL/SQL és una extensió del SQL, que permet definir variables, crear procediments i funcions, i tots els elements que trobem en un llenguatge de programació: bucles, condicionals,... PostgreSQL i MySQL també implementen avui dia funcionalitats similars.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica es crearà un procediment PL/SQL bàsic per tal que els alumnes d'Administració de Sistemes vegin les possibilitats d'extendre el llenguatge SQL.&lt;br /&gt;
&lt;br /&gt;
==Teoria==&lt;br /&gt;
===Què és PL/SQL?===&lt;br /&gt;
*un llenguatge de programació&lt;br /&gt;
*una extensió del llenguatge SQL.&lt;br /&gt;
*una nova forma de treball.&lt;br /&gt;
*una combinació de:&lt;br /&gt;
**poder de Manipulació de Dades mitjançant llenguatge SQL.&lt;br /&gt;
**poder de processament dels llenguatges procedimentals.&lt;br /&gt;
&lt;br /&gt;
Un bloc PL/SQL esà dividit en les següents parts:&lt;br /&gt;
&lt;br /&gt;
#Declaració de variables (DECLARE)&lt;br /&gt;
#Sentències executables (BEGIN)&lt;br /&gt;
#Declaració d’excepcions (EXCEPTION)&lt;br /&gt;
&lt;br /&gt;
Només la part executable (BEGIN) és obligatòria.&lt;br /&gt;
&lt;br /&gt;
El sistema d’execució de PL/SQL és una tecnologia, no un producte independent. Aquesta tecnologia actua com un motor, capaç d’executar blocs i subprogrames PL/SQL i que pot ser instalada en el servidor Oracle o en les eines Oracle.&lt;br /&gt;
&lt;br /&gt;
Un bloc SQL conté parts procedimentals (que són executades pel motor PL/SQL) i parts SQL (que són executades pel motor SQL).&lt;br /&gt;
&lt;br /&gt;
Els blocs PL/SQL poden estar inclosos en programes host (programes escrits en un altre llenguatge, com ara C).&lt;br /&gt;
&lt;br /&gt;
Els procediments i funcions escrits amb PL/SQL es poden compilar i guardar-se a la base de dades, llestos per executar-se quan són cridats per un programa.&lt;br /&gt;
&lt;br /&gt;
===Beneficis del PL/SQL===&lt;br /&gt;
*capacitats procedimentals.&lt;br /&gt;
*Està estructurat en bloc (múltiples sentències formen un bloc). &lt;br /&gt;
*Condicions (IF), iteracions (FOR, WHILE, LOOP), control d’errors (excepcions), varaibles i constants, funcions.&lt;br /&gt;
*millora del rendiment. Totes les sentències d’un bloc s’envien directament al nucli ORACLE, produïnt una reducció considerable del número de crides al sistema.&lt;br /&gt;
*portabilitat. Qualsevol programa que s’hagi dissenyat en qualsevol de les plataformes on s’executa Oracle, pot ser transportat d’una plataforma a una altra sense cap problema d’execució (portabilitat de software).&lt;br /&gt;
*integració amb el RDBMS. PL/SQL incorpora les sentències SQL (SELECT, INSERT, UPDATE, DELETE,…). PL/SQL permet obtenir variables i constants basades en el tipus de dades actual de columnes de la base de dades, o referenciar-se a estructures completes de files d’una taula.&lt;br /&gt;
&lt;br /&gt;
==Desenvolupament==&lt;br /&gt;
Per començar, escriu aquestes línies en un fitxer sql, i executa’l des del SQL*Plus (o els Worksheet).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rem perque es pugui visualitzar per pantalla he d'executar&lt;br /&gt;
rem la sentencia SET SERVEROUTPUT ON;&lt;br /&gt;
declare&lt;br /&gt;
a date;&lt;br /&gt;
begin&lt;br /&gt;
a:=sysdate;&lt;br /&gt;
dbms_output.put_line(a);&lt;br /&gt;
end;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A la pantalla t’haurà de sortir la data d’avui. Intenta fer algun petit canvi.&lt;br /&gt;
&lt;br /&gt;
===Aplicació de càlcul de nòmines===&lt;br /&gt;
&lt;br /&gt;
Una empresa col.labora amb diferents professionals freelance que treballen per hores. En la següent base de dades es té un recompte dels treballadors i el seu preu-hora en funció de la seva categoria professional. A final de mes s’introdueixen les hores treballades dins la base de dades. Amb el fitxer nòmina.sql, que té un bloc PL/SQL, es calcula el sou mensual i s’introdueix en la taula Nòmina.&lt;br /&gt;
&lt;br /&gt;
Segons la descripció del problema, interpreta i escriu les següents sentències de construcció de les taules i d’inserció de les dades.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table empleat (nom varchar2(10) primary key,preu_hora number(2));&lt;br /&gt;
&lt;br /&gt;
create table hores (nom varchar2(10) references empleat, num_hores number(3), mes varchar2(10), primary key(nom,mes));&lt;br /&gt;
&lt;br /&gt;
create table nomina (nom varchar2(10) primary key references empleat, sou number(7));&lt;br /&gt;
&lt;br /&gt;
insert into empleat values('Pep',15);&lt;br /&gt;
insert into empleat values('Anna',30);&lt;br /&gt;
insert into empleat values('Marta',25);&lt;br /&gt;
insert into empleat values('Núria',35);&lt;br /&gt;
insert into empleat values('Miquel',20);&lt;br /&gt;
insert into empleat values('Albert',22);&lt;br /&gt;
insert into empleat values('Clara',30);&lt;br /&gt;
insert into empleat values('Enric',12);&lt;br /&gt;
insert into empleat values('Domènech',25);&lt;br /&gt;
insert into empleat values('Rosa',20);&lt;br /&gt;
&lt;br /&gt;
insert into hores values('Pep',120,'febrer');&lt;br /&gt;
insert into hores values('Anna',130,'febrer');&lt;br /&gt;
insert into hores values('Marta',110,'febrer');&lt;br /&gt;
insert into hores values('Núria',180,'febrer');&lt;br /&gt;
insert into hores values('Miquel,200,'febrer');&lt;br /&gt;
insert into hores values('Albert,210,'febrer');&lt;br /&gt;
insert into hores values('Clara',126,'febrer');&lt;br /&gt;
insert into hores values('Enric',148,'febrer');&lt;br /&gt;
insert into hores values('Domènech',183,'febrer');&lt;br /&gt;
insert into hores values('Rosa',196,'febrer');&lt;br /&gt;
insert into hores values('Pep',235,'març');&lt;br /&gt;
insert into hores values('Anna',188,'març');&lt;br /&gt;
insert into hores values('Marta',178,'març');&lt;br /&gt;
insert into hores values('Núria',220,'març');&lt;br /&gt;
insert into hores values('Miquel',210,'març');&lt;br /&gt;
insert into hores values('Albert',215,'març');&lt;br /&gt;
insert into hores values('Clara',198,'març');&lt;br /&gt;
insert into hores values('Enric',86,'març');&lt;br /&gt;
insert into hores values('Domènech',134,'març');&lt;br /&gt;
insert into hores values('Rosa',126,'març');&lt;br /&gt;
&lt;br /&gt;
COMMIT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''FITXER NOMINA.SQL'''&lt;br /&gt;
&lt;br /&gt;
Escriu en el fitxer NOMINA.SQL el següent bloc PL/SQL, tot entenent el que fa, i executa’l. (Per identificar els errors podràs escriure SHOW ERRORS).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rem perque es pugui visualitzar per pantalla he d'executar&lt;br /&gt;
rem la sentencia SET SERVEROUTPUT ON;&lt;br /&gt;
declare&lt;br /&gt;
   nom_empleat varchar2(10);&lt;br /&gt;
   numero_hores number(3);&lt;br /&gt;
   euros_hora number(4);&lt;br /&gt;
   euros_mes number(7);&lt;br /&gt;
   cursor recompte is&lt;br /&gt;
      select empleat.nom,preu_hora,num_hores from empleat,hores where mes='març'&lt;br /&gt;
             and empleat.nom=hores.nom;&lt;br /&gt;
begin&lt;br /&gt;
   open recompte;&lt;br /&gt;
   fetch recompte into nom_empleat,euros_hora,numero_hores;&lt;br /&gt;
   while recompte%found loop&lt;br /&gt;
      euros_mes:=euros_hora*numero_hores;&lt;br /&gt;
      dbms_output.put_line(nom_empleat);&lt;br /&gt;
      dbms_output.put_line(euros_hora);&lt;br /&gt;
      dbms_output.put_line(numero_hores);&lt;br /&gt;
      dbms_output.put_line(euros_mes);&lt;br /&gt;
      insert into nomina values(nom_empleat,euros_mes);&lt;br /&gt;
      fetch recompte into nom_empleat,euros_hora,numero_hores;&lt;br /&gt;
   end loop;&lt;br /&gt;
   close recompte;&lt;br /&gt;
end;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Exercicis a realitzar:'''&lt;br /&gt;
&lt;br /&gt;
1.Modifica la taula nomina per tal que emmagatzemi, a part del nom i el sou brut, la retenció del 20%, el sou base, el número d’hores, el preu_hora i el mes. Després adapta el codi per tal que s’ompli correctament la taula nomina i per la pantalla surti una informació completa.&lt;br /&gt;
 &lt;br /&gt;
2.El codi que has executat es diu un bloc anònim, es carrega en memòria, es compila i s’executa. Tot el codi es pot grabar com a procediment emmagatzemat, que es guarda compilat com a objecte en la base de dades. A més a més, li podem passar com a argument el mes del qual volem calcular la nòmina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE PROCEDURE prog_nomina (vmes VARCHAR)&lt;br /&gt;
AS &lt;br /&gt;
&amp;lt;codi&amp;gt;&lt;br /&gt;
... from empleat,hores where mes=vmes...&lt;br /&gt;
&amp;lt;codi&amp;gt;&lt;br /&gt;
insert into ... values( ...,vmes);&lt;br /&gt;
&amp;lt;codi&amp;gt; &lt;br /&gt;
END prog_nomina&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nota: ara sobra la instrucció DECLARE després de AS&lt;br /&gt;
&lt;br /&gt;
Si s’ha compilat sense errors, pots comprovar que existeix com a procediment emmagatzemat (PROCEDURE) dins el teu esquema (utilitza el DBA Studio o similar)&lt;br /&gt;
&lt;br /&gt;
Per executar el procediment:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; execute prog_nomina('març')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
3.A partir de la taula nomina, crea un informe pensat per a ser imprès en què es detalli, per a cada empleat, el número d’hores, preu_hora, la retenció i el total a percebre per cada treballador. Per formatar la sortida amb el SQL*Plus pots trobar informació a http://www.infor.uva.es/~jvegas/cursos/bd/sqlplus/sqlplus.html (apartat 11.2, Generació d’informes)&lt;br /&gt;
&lt;br /&gt;
==Entrega==&lt;br /&gt;
Entregaràs el script resultant al Moodle (amb el seu log). Entrega també el fitxer de l'informe a imprimir, que aconseguiràs fent un segon spool.&lt;br /&gt;
&lt;br /&gt;
script NA5_XX.sql&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SPOOL NA5_XX.log&lt;br /&gt;
&lt;br /&gt;
DROP TABLE...&lt;br /&gt;
...&lt;br /&gt;
CREATE TABLE ...&lt;br /&gt;
INSERT INTO ...&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE PROCEDURE...&lt;br /&gt;
...&lt;br /&gt;
SPOOL OFF&lt;br /&gt;
&lt;br /&gt;
SPOOL NA5_NOMINA_XX.log&lt;br /&gt;
PAGESIZE ...&lt;br /&gt;
...&lt;br /&gt;
SELECT ... FROM NOMINA ...;&lt;br /&gt;
SPOOL OFF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Recursos==&lt;br /&gt;
*http://www.infor.uva.es/~jvegas/cursos/bd/sqlplus/sqlplus.html#informes&lt;br /&gt;
&lt;br /&gt;
==Durarda==&lt;br /&gt;
2 hores&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, novembre 2009&lt;br /&gt;
[[Categoria: IES Jaume Balmes]]&lt;br /&gt;
[[Categoria: Pràctiques ASI-C6-ASGBD]]&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>