<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
		<id>http://wikiserver.infomerce.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Srebordosa</id>
		<title>wikiserver - Contribucions de l’usuari [ca]</title>
		<link rel="self" type="application/atom+xml" href="http://wikiserver.infomerce.es/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Srebordosa"/>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php/Especial:Contribucions/Srebordosa"/>
		<updated>2026-04-18T14:07:45Z</updated>
		<subtitle>Contribucions de l’usuari</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18947</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18947"/>
				<updated>2025-03-19T17:52:05Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18946</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18946"/>
				<updated>2025-03-19T17:51:49Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18945</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18945"/>
				<updated>2025-03-19T17:51:24Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18944</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18944"/>
				<updated>2025-03-19T14:41:04Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18943</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18943"/>
				<updated>2025-03-19T14:40:51Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18942</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18942"/>
				<updated>2025-03-19T13:45:58Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18941</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18941"/>
				<updated>2025-03-19T13:45:39Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18940</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18940"/>
				<updated>2025-03-19T13:44:46Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18939</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18939"/>
				<updated>2025-03-19T13:44:18Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18938</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18938"/>
				<updated>2025-03-19T13:44:06Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18937</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL-2</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL-2&amp;diff=18937"/>
				<updated>2025-03-19T13:43:33Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Solucions exercicis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Creació de procediments==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà, compilarà i farà crides a procediments que emeten ordres DML i de consulta. També aprendrà a manegar excepcions en els procediments.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no ha realitzat un pas d'una pràctica, execute el script de solucions adequat del pas de la pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearà i cridarà al procediment ADD_JOB, a més a més de revisar el resultat. També crearà i cridarà a un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS; tanmateix, crearà i cridarà a un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS. Per últim, crearà un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorna el salari i l'identificador de treball d'un empleat quan es proporciona l'identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea, compila i crida al procediment ADD_JOB i revisa el resultat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat ADD_JOB per afegir un nou treball en la taula JOBS. Proporciona l'identificador i el càrrec utilitzant dos paràmetres.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' pots crear el procediment (així com altres objectes) mitjançant la introducció del codi en l'àre SQL Worksheet i, a continuació, fer clic en l¡icona Run Script (F5). De aquesta forma, es crea i compila el procediment. Per saber si el procediment conté o no errors, fes clic en el nom del mateix en el node de procediments i, a continuació, selecciona Compile en el menú emergent.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment amb IT_DBA com a identificadro del treball i Database Administrator com a càrrec. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_1.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou i passa-li com a identificador de treball ST_MAN i un càrrec Stock Manager. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un procediment anomenat UPD_JOB per modificar un treball en la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat UPD_JOB per actualitzar el càrrec. Proporciona el identificador de treball i un càrrec nou utilitzant dos paràmetres. Inclou el manegador d'excepcions necessari si no s'ha produït l'actualització.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment per canviar el càrrec de l'identificador de treball IT_DBA a Data Administrador. Consulta la taula JOBS i mira el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_2.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c)  Prova la secció del manegador d'excepcions del procediment intentant actualitza un treball que no existeixi. Pots utilitzar l'identificador de treball IT_WEB i el càrrec Web Master.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_3.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un procediment anomenat DEL_JOB per suprimir un treball de la taula JOBS.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat DEL_JOB per suprimir un treball. Inclou el codi de manegador d'excepcions necessari si no s'ha suprimit cap treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment mitjançant l'identificador de treball IT_DBA. Consulta la taula JOBS i mira el resultat. &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_4.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Prova la secció del manegador d'excepcions del procediment intentant suprimir un treball que no existeixi. Utilitza IT_WEB com a identificador de treball. Apareixerà el missatge que has inclòs en la secció del manegador d'excepcions del procediment com a sortida.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_5.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Crea un procediment anomenat GET_EMPLOYEE per consultar la taula EMPLOYEES, que retorni el salari i l'identificador de treball d'un empleat quan es proporciona el identificador de l'empleat.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment que retorni un valor de les columnes SALARY i JOB_ID per l'identificador d'empleat especificat. Elimina els errors de sintaxi, si n'hi ha i, a continuació, recompila el codi.&lt;br /&gt;
&lt;br /&gt;
:b) Executa el procediment utilitzant les variables del host per als dos paràmetres OUT: una per al salari i l'altre per l'identificador de treball. Mostra el salari i l'identificador de treball per a l'identificador de empleat 120.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_CCC_6.png |500px|center| Creació, compilació crida de procediments]]&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment de nou amb un EMPLOYEE_ID 300. Què succeïx? Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de funcions i depuració de subprogrames==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, crearàs, compilaràs i utilitzaràs funcions emmagatzemades i un procediment:&lt;br /&gt;
&lt;br /&gt;
:1) Crea i crida a la funció GET_JOB per retornar un càrrec.&lt;br /&gt;
&lt;br /&gt;
::a) Crea i compila la funció anomenada GET_JOB per retornar un càrrec (job_title) a partir del identificador (job_id).&lt;br /&gt;
&lt;br /&gt;
::b) Crea una variable de host VARCHAR2 anomenada b_title, que permeti una longitud e 35 caràcters. Crida la funció amb l'identificador de treball SA_REP per que retorni el valor de la variable de host i, a continuació, imprimeix la variable de host per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_1.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:2) Crea una funció anomenada GET_ANNUAL_COMP per retornar el salari anual d'un empleat calculat a partir del salari mensual i la comissió transferits com a paràmetres.&lt;br /&gt;
&lt;br /&gt;
::a) Crea la funció GET_ANNUAL_COMP, que accepti valors de paràmetres del salari mensual i la comissió. Un o els dos valors transferits poden ser NULL, però la funció haurà de retornar un salari anual no NULL. Utilitza la següent fórmula bàsica per calcular el salari anual:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (salary*12) + (commission_pct*salary*12)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::b) Utilitza la funció en una sentència SELECT en la taula EMPLOYEES per als empleats del departament 30.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_funcions_2.png |500px|center| Funcions]]&lt;br /&gt;
&lt;br /&gt;
:3) Crea un procediment, ADD_EMPLOYEE, per afegir un nou empleat en la taula EMPLOYEES. El procediment cridarà a una funció VALID_DEPTID per comprovar si l'identificador (ID) de departament especificat per al nou empleat existeix en la taula DEPARTMENTS.&lt;br /&gt;
&lt;br /&gt;
::a) Crea una funció anomenada VALID_DEPTID per validar l'identificador de departament especificat i retornar un valor BOOLEAN TRUE si existeix el departament.&lt;br /&gt;
&lt;br /&gt;
::b) Crea el procediment ADD_EMPLOYEE per afegir un empleat a la taula EMPLOYEES. La fila s'ha d'afegir a la taula EMPLOYEES si la funció VALID_DEPTID retorna TRUE; en cas contrari, alertarà a l'usuari amb un missatge adequat. Proporciona els següents paràmetres:&lt;br /&gt;
&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- email&lt;br /&gt;
:::- job: utilitza 'SA_REP' com a valor per defecte.&lt;br /&gt;
:::- mgr: utilitza 145 com a valor per defecte.&lt;br /&gt;
:::- sal: utilitza 1000 com a valor per defecte.&lt;br /&gt;
:::- comm: utilitza 0 com a valor per defecte.&lt;br /&gt;
:::- deptid: utilitza 30 com a valor per defecte.&lt;br /&gt;
:::- Utilitza la seqüència EMPLOYEES_SEQ per definir la columna employee_id.&lt;br /&gt;
:::- Defineix la columna hire_date com a TRUNC(SYSDATE).&lt;br /&gt;
&lt;br /&gt;
::c) Crida a ADD_EMPLOYEE per al nom 'Jane Harris' del departament 15, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
::d) Afegeix un altre empleat anomenat 'Joe Harris' en el departament 80, deixant els altres paràmetres amb els valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, es presentarà la funcionalitat bàsica del depurador de SQL Developer:&lt;br /&gt;
&lt;br /&gt;
:* Crea un procediment i una funció.&lt;br /&gt;
:* Afegeix punts de divisió en el procediment creat.&lt;br /&gt;
:* Compila el procediment i la funció per al mode de depuració.&lt;br /&gt;
:* Depura el procediment i desplaçat a la primera línia executable del codi.&lt;br /&gt;
:* Mostra i modifica les variables dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si no has realitzat un pas d'una pràctica, executa el sript de solucions adequat d'aquest pas del pràctica abans de continuar amb el següent pas o amb la següent pràctica.&lt;br /&gt;
&lt;br /&gt;
:1) Activa SERVEROUTPUT.&lt;br /&gt;
&lt;br /&gt;
:2) Executa el script sol_02_02_02.sql per crear el procediment emp_list.&lt;br /&gt;
:Examina el codi del procediment i compila el procediment. Per què apareix l'error del compilador?&lt;br /&gt;
&lt;br /&gt;
:3) Executa el script  sol_02_02_03.sql per la funció get_location.&lt;br /&gt;
:Examina el codi de la funció, compila la funció i, a continuació, corregeix els possibles errors.&lt;br /&gt;
&lt;br /&gt;
:4) Recompila el procediment emp_list. El proceiment ha de compilarse correctament.&lt;br /&gt;
&lt;br /&gt;
:5) Edita el procediment emp_list i la funció get_location.&lt;br /&gt;
&lt;br /&gt;
:6) Agrega quatre punts de divisió al procediemtn emp_list en les següents línies de codi:&lt;br /&gt;
::a) OPEN emp_cursor;&lt;br /&gt;
::b) WHILE (emp_cursor%FOUND) AND (i &amp;lt;= pMaxRows) LOOP&lt;br /&gt;
::c) v_city := get_location (emp_record.department_name);&lt;br /&gt;
::d) CLOSE emp_cursor;&lt;br /&gt;
&lt;br /&gt;
:7) Compila el procediment emp_list per a la depuració.&lt;br /&gt;
&lt;br /&gt;
:8) Depura el procediment.&lt;br /&gt;
&lt;br /&gt;
:9) Introdueix 100 com a valor del paràmetre PMAXROWS.&lt;br /&gt;
&lt;br /&gt;
:10) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP y EMP_TAB? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:11) Utilitza l'opció de depuració Step Into per anar a cada línia de codi de emp_list i passar per el bucle while només una vegada.&lt;br /&gt;
&lt;br /&gt;
:12) Examina el valor de les variables en el separador Data. Quins són els valors assignats a REC_EMP?&lt;br /&gt;
&lt;br /&gt;
:13) Segueix premen F7 fins que s'executi la línia emp_tab(i) := rec_emp;.&lt;br /&gt;
:Examina el valor de les variables en el separador Data. Quins són els valors assignats a EMP_TAB?&lt;br /&gt;
&lt;br /&gt;
:14) Utilitza el separador Data per a modificar el valor del comptador i a 98.&lt;br /&gt;
&lt;br /&gt;
:15) Segueix premen F7 fins que es vegi la llista de empleats en el separador Debugging – Log. Quants empleats apareixen?&lt;br /&gt;
&lt;br /&gt;
:16) Si utilitzes l'opció del depurador Step Over per a desplaçar-te per el codi, es desplaça per la funció get_location? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
==Creació de paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica. crearàs cossos i especificacions de paquets. A continuació, cridaràs a les construccions dels paquets amb dades d'exemple.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Crea una especificació del paquet i un cos del paquet anomenat JOB_PKG, amb una còpia dels procediments ADD_JOB, UPD_JOB i DEL_JOB, així com la seva funció GET_JOB.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el codi dels procediments i les funcions guardats prèviament al crear el paquet. Pots copiar el codi d'un procediment o una funció per a, a continuació, enganxar-lo en la secció adequada del paquet.&lt;br /&gt;
&lt;br /&gt;
:a) Crea l'especificació del paquet, inclosos els procediments i les capçaleres de funció com a construccions públiques.&lt;br /&gt;
&lt;br /&gt;
:b) Crea el cos del paquet amb les implantacions de cada un dels subprogrames.&lt;br /&gt;
&lt;br /&gt;
:c) Suprimeix els procediments i funció autònoms següents que acabes d'empaquetar amb els nodes Procedures i Functions del arbre Object Navigation:&lt;br /&gt;
&lt;br /&gt;
::i) Els procedimients ADD_JOB, UPD_JOB i DEL_JOB&lt;br /&gt;
::ii) La funció GET_JOB&lt;br /&gt;
&lt;br /&gt;
:d) Crida al procediment empaquetat ADD_JOB transferint-li com a paràmetres els valors IT_SYSAN i SYSTEMS ANALYST.&lt;br /&gt;
&lt;br /&gt;
:e) Consulta la taula JOBS per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_paquets_1.png |500px|center| Paquets]]&lt;br /&gt;
&lt;br /&gt;
'''2.''' Crea i crida un paquet que contingui construccions públiques i privades.&lt;br /&gt;
&lt;br /&gt;
:a) Crea una especificació del paquet i un cos del paquet anomenats EMP_PKG, que contingui els següents procediments i funció creats anteriorment:&lt;br /&gt;
&lt;br /&gt;
::i) Procediment ADD_EMPLOYEE com a construcció pública&lt;br /&gt;
::ii) Procedimient GET_EMPLOYEE com a construcció pública&lt;br /&gt;
::iii) Funció VALID_DEPTID com a construcció privada&lt;br /&gt;
&lt;br /&gt;
:b) Crida al procediment EMP_PKG.ADD_EMPLOYEE, amb l'identificador de departament 15 per a l'empleada Jane Harris amb identificador de correu electrònic JAHARRIS. Com l'identificador de departament 15 no existeix, rebràs un missatge d'error com s'especifica en el manegador d'excepcions del procediment.&lt;br /&gt;
&lt;br /&gt;
:c) Crida al procediment empaquetat ADD_EMPLOYEE utilitzant l'identificador de departament 80 per al empleat  David Smith amb l'identificador de correu electònic DASMITH.&lt;br /&gt;
&lt;br /&gt;
:d) Consulta la taula EMPLOYEES per verificar que s'ha afegit el nou empleat.&lt;br /&gt;
&lt;br /&gt;
==Treballar amb paquets==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs el codi del paquet EMP_PKG que has creat anteriorment i, a continuació, sobrecarregaràs el procediment ADD_EMPLOYEE. A continuació crearàs dues funcions sobrecarregades anomenades GET_EMPLOYEE en el paquet EMP_PKG. També afegiràs un procediment públic a EMP_PKG per omplir una taula PL/SQL privada de identificadors de departament vàlids, a més a més de modificar la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors de identificador vàlids. També canviaràs la funció de procesament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada de identificadors de departament. Per últim, reorganitzaràs els subprogrames en el cos i l'especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Modifica el codi del paquet EMP_PKG que has creat a la Pràctica 4, pas 2 i sobrecarrega el procediment ADD_EMPLOYEE.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, afegeix un nou procediment anomenat ADD_EMPLOYEE, que accepti els tres paràmetres següents:&lt;br /&gt;
&lt;br /&gt;
::i) First name&lt;br /&gt;
::ii) Last name&lt;br /&gt;
::iii) Department ID&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) Implanta el nou procediment ADD_EMPLOYEE en el cos del paquet, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Formata la adreça de correu electrònic en caràcters en majúscula, utilitzant la primera lletra del nom concatenat amb les set primeres lletres del cognom.&lt;br /&gt;
::ii) El procediment cridarà al procediment ADD_EMPLOYEE existent per realitzar l'operació INSERT real utilitzant els paràmetres i el correu electrònic formatat per proporcionar els valors.&lt;br /&gt;
::iii) Prem Run Script per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:d) Crida al nou procediment ADD_EMPLOYEE utilitzant el nom Samuel Joplin per afegir-lo al departament 30.&lt;br /&gt;
&lt;br /&gt;
:e) Confirma que el nou empleat s'ha afegit a la taula EMPLOYEES.&lt;br /&gt;
&lt;br /&gt;
'''2.''' En el paquet EMP_PKG, crea dues funcions sobrecarregades anomenades GET_EMPLOYEE:&lt;br /&gt;
&lt;br /&gt;
:a) En la especificació del paquet, afegeix les següents funcions:&lt;br /&gt;
&lt;br /&gt;
::i) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_emp_id basat en el tipus employees.employee_id%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) La funció GET_EMPLOYEE que accepta el paràmetre anomenat p_family_name de tipus employees.last_name%TYPE. Aquesta funció ha de retornar EMPLOYEES%ROWTYPE.&lt;br /&gt;
&lt;br /&gt;
:b) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:c) En el cos del paquet:&lt;br /&gt;
&lt;br /&gt;
::i) Fes la primera funció GET_EMPLOYEE per consultar un empleat mitjançant l'identificador del mateix.&lt;br /&gt;
&lt;br /&gt;
::ii) Fes la segona funció GET_EMPLOYEE per utilitzar l'operador d'igualtat en el valor subministrat en el paràmetre p_family_name.&lt;br /&gt;
&lt;br /&gt;
:d) Prem Run Script per tornar a crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:e) Afegeix un procediment d'utilitat PRINT_EMPLOYEE al paquet EMP_PKG, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta EMPLOYEES%ROWTYPE com a paràmetre.&lt;br /&gt;
::ii) El procediment mostra el següent per a un empleat en una línia, mitjançant el paquet DBMS_OUTPUT:&lt;br /&gt;
&lt;br /&gt;
:::- department_id&lt;br /&gt;
:::- employee_id&lt;br /&gt;
:::- first_name&lt;br /&gt;
:::- last_name&lt;br /&gt;
:::- job_id&lt;br /&gt;
:::- salary&lt;br /&gt;
&lt;br /&gt;
:f) Prem Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
:g) Utilitza un bloc anònim per cridar a la funció EMP_PKG.GET_EMPLOYEE amb un identificador d'empleat 100 i amb cognom 'Joplin'. Utilitza el procediment PRINT_EMPLOYEE per mostrar els resultats per a cada fila tornada.&lt;br /&gt;
&lt;br /&gt;
'''3.''' Com la companyia no canvia amb freqüència les seves dades de departament, pots millorar el rendiment de EMP_PKG afegint un procediment públic, INIT_DEPARTMENTS, per omplir una taula PL/SQL privada d'identificadors de&lt;br /&gt;
departament vàlids. Modifica la funció VALID_DEPTID per utilitzar el contingut de la taula PL/SQL privada amb el fi de validar els valors dels identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el script de l'arxiu de solucions sol_04_03.sql conté el codi dels passos a, b i c.&lt;br /&gt;
&lt;br /&gt;
:a) En l'especificació del paquet, crea un procediment anomenat INIT_DEPARTMENTS sense paràmetres. Per fer-ho, afegeix el següent a la secció d'especificació del paquet abans de la especificació PRINT_EMPLOYEES:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) En el cos del paquet, implanta el procediment INIT_DEPARTMENTS per emmagatzemar tots els identificadors de departament en una taula d'índex PL/SQL privada anomenada valid_departments que conté valores BOOLEAN.&lt;br /&gt;
&lt;br /&gt;
::i) Declara la variable valid_departments i la seva definició de tipus boolean_tab_type abans que tots els procediments del cos.&lt;br /&gt;
&lt;br /&gt;
::Introdueix el següent al començament del cos del paquet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     TYPE boolean_tab_type IS TABLE OF BOOLEAN&lt;br /&gt;
     INDEX BY BINARY_INTEGER;&lt;br /&gt;
     valid_departments boolean_tab_type;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::ii) Utilitza el valor de la columna department_id com a índex per crear l'entrada en la taula de índex per indicar la seva presencia i assignar a l'entrada un valor de TRUE. Introdueix la declaració del procediment INIT_DEPARTMENTS al final del cos del paquet (justament després del procediment print_employees), de la sigüent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     PROCEDURE init_departments IS&lt;br /&gt;
     BEGIN&lt;br /&gt;
        FOR rec IN (SELECT department_id FROM departments)&lt;br /&gt;
          LOOP&lt;br /&gt;
            valid_departments(rec.department_id) := TRUE;&lt;br /&gt;
          END LOOP;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::c) En el cos, crea un bloc d'inicialització que cridi al procediment INIT_DEPARTMENTS per inicialitzar la taula, de la següent forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     BEGIN&lt;br /&gt;
        init_departments;&lt;br /&gt;
     END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
::d) Prem en Run Script (F5) per crear i compilar el paquet.&lt;br /&gt;
&lt;br /&gt;
'''4.''' Canvia la funció de processament de validació VALID_DEPTID per utilitzar la taula PL/SQL privada d'identificadors de departament.&lt;br /&gt;
&lt;br /&gt;
:a) Modifica la funció VALID_DEPTID per realitzar la validació utilitzant la taula PL/SQL de valors d'identificadors de departament. Prem en Run Script (F5) per crear el paquet. Compila el paquet.&lt;br /&gt;
&lt;br /&gt;
:b) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Afegeix un nou departament. Especifica 15 como identificador del departament i 'Security' com a nom del departament. Confirma i verifica els canvis.&lt;br /&gt;
&lt;br /&gt;
:d) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Executa el procediment EMP_PKG.INIT_DEPARTMENTS per actualitzar la taula interna PL/SQL amb les últimes dades del departament.&lt;br /&gt;
&lt;br /&gt;
:f) Prova el codi cridant a ADD_EMPLOYEE amb el nom James Bond en el departament 15. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:g) Suprimeox al empleat James Bond y el departament 15 de les seves respectives taules, confirma els canvis i refresca les dades del departament cridant al procediment EMP_PKG.INIT_DEPARTMENTS. Assegurat d'introduir SET SERVEROUTPUT ON abans.&lt;br /&gt;
&lt;br /&gt;
'''5.''' Reorganitza els subprogrames en el cos de la especificació del paquet per a que estiguin en seqüència alfabètica.&lt;br /&gt;
&lt;br /&gt;
:a) Edita la especificació del paquet i reorganitza els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Compila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Edita el cos del paquet i reorganitza tots els subprogrames de forma alfabètica. Prem en Run Script per tornar a crear la especificació del paquet. Recompila l'especificació del paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:c) Corregeix l'error de compilació utilitzant una declaració anticipada en el cos per a la referencia de subprograma adequada. Prem en Run Script per tornar a crear el paquet i, a continuació, recompila el paquet. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
==Ús de paquets proporcionats per Oracle==&lt;br /&gt;
&lt;br /&gt;
Autoritzar al usuari HR a emprar el paquet UTL_FILE:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  SQL&amp;gt; connect sys as sysdba;&lt;br /&gt;
&lt;br /&gt;
  SQL&amp;gt; grant execute on sys.utl_file to hr;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, utilitzarà el paquet UTL_FILE per generar un informe d'arxiu de text dels empleats de cada departament. Primer cal crear i executar un procediment anomenat EMPLOYEE_REPORT, que generà un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE. Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament. Finalment, es mostrara el contingut de l'arxiu de text per pantalla.&lt;br /&gt;
&lt;br /&gt;
1. Crea un procediment anomenat EMPLOYEE_REPORT, que generi un informe d'empleats en un arxiu del sistema operatiu utilitzant el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
Aquest informe generarà una llista dels empleats que tenen un salari superior al salari mig del seu departament.&lt;br /&gt;
&lt;br /&gt;
:a) El procediment rebrà dos paràmetres. El primer és el directori de sortida. El segon és el nom de l'arxiu de text.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' Utilitza el valor de la ubicació del directori UTL_FILE. Agrega una secció per manegar les excepcions que es poden produir al utilitzar el paquet UTL_FILE.&lt;br /&gt;
&lt;br /&gt;
:b) Crea i compila el procediment.&lt;br /&gt;
&lt;br /&gt;
2. Crida al procediment amb els dos arguments següents: &lt;br /&gt;
&lt;br /&gt;
:a) Utilitza REPORTS_DIR com alies per l'objecte de directori com a primer paràmtre.&lt;br /&gt;
:b) Utilitza sal_rpt.txt com a segon paràmetre.&lt;br /&gt;
&lt;br /&gt;
3. Per mostrar el contingut de l'arxiu, procedeix de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Fes clic dues vegades en la icona Terminal de l'escriptori. Es mostrarà la finestra Terminal.&lt;br /&gt;
:b) Situat en el directori on es trobi l'arxiu generat (/home/oracle/labs/plpu/reports),&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' pots utilitzar l'ordre pwd per mostrar el directori actual.&lt;br /&gt;
&lt;br /&gt;
:c) Llista el contingut del directori (ordre ls).&lt;br /&gt;
:d) Obre l'arxiu transferit sal_rpt.txt, amb l'editor que vulguis.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs disparadors de sentencia i de fila. També crearàs procediments que es cridaran des de els disparadors.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Les files de la taula JOBS emmagatzemen  els salaris mínims i màxims permesos per als diferents valors de JOB_ID. Escriu un codi per garantir que el salari dels empleats estigui dins del rang permés pel seu tipus de treball, per a operacions de inserció i actualització. &lt;br /&gt;
&lt;br /&gt;
:a) Crea un procediment anomenat CHECK_SALARY, de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) El procediment accepta dos paràmetres, un per a la cadena de l'identificador de treball del empleat i l'altre per al salari.&lt;br /&gt;
::ii) El procediment utilitza l'identificador de treball per a determinar el salari mínim i màxim per al treball especificat.&lt;br /&gt;
::iii) Si el paràmetre del salari, mínim i màxim inclosos, no es troba dins del rang de salaris, apareixerà una excepció d'aplicació amb el missatge “Invalid salary &amp;lt;sal&amp;gt;. Salaries for job &amp;lt;jobid&amp;gt; must be between &amp;lt;min&amp;gt; and &amp;lt;max&amp;gt;.” Substitueix els diferents elements del missatge per els valors que proporcionen els paràmetres i les variables omplerts amb consultes. Guarda l'arxiu.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador anomenat CHECK_SALARY_TRG en la taula EMPLOYEES que arranqui davant d'una operació INSERT o UPDATE en cada fila:&lt;br /&gt;
&lt;br /&gt;
::i) El disparador ha de cridar al procediment CHECK_SALARY per executar la lògica de negoci.&lt;br /&gt;
::ii) El disparador ha de transferir el nou identificador de treball i salari als paràmetres de procediment.&lt;br /&gt;
&lt;br /&gt;
'''2.''' Prova el disparador CHECK_SAL_TRG utilitzant els següents casos:&lt;br /&gt;
&lt;br /&gt;
:a) Utilitza el procediment EMP_PKG.ADD_EMPLOYEE per afegir a la empleada Eleanor Beh al departament 30. Què succeeix? ¿Per què?&lt;br /&gt;
&lt;br /&gt;
:b) Actualitza el salari de l'empleat 115 a 2.000 dòlars. En un altre operació d'actualització, canvia l'identificador de treball de l'empleat a HR_REP. Què succeeix en cada cas?&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza el salari de l'empleat 115 a 2.800 dòlars. Què succeeix?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Actualitza el disparador CHECK_SALARY_TRG per a que arranqui només quan els valors de l'identificador de treball o el salari hagin canviat en realitat.&lt;br /&gt;
&lt;br /&gt;
:a) Implanta la regla de negoci utilizant una clàusula WHEN per comprovar si els valors JOB_ID o SALARY han canviat.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegurat de que la condició manega NULL en els valors de OLD.column_name si es realitza una operació INSERT; si no es així, la operació d'inserció fallarà.&lt;br /&gt;
&lt;br /&gt;
:b) Comprova el disparador executant el procediment EMP_PKG.ADD_EMPLOYEE amb els següents valors de paràmetroes:&lt;br /&gt;
::- p_first_name: 'Eleanor'&lt;br /&gt;
::- p_last name: 'Beh'&lt;br /&gt;
::- p_Email: 'EBEH'&lt;br /&gt;
::- p_Job: 'IT_PROG'&lt;br /&gt;
::- p_Sal: 5000&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza als empleats amb un treball IT_PROG incrementant el seu salari en 2.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:d) Actualitza a 9.000 dòlars el salari de Eleanor Beh.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' utilitza una sentencia UPDATE amb una subconsulta en la clàusula WHERE.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:e) Canvia el treball de Eleanor Beh a ST_MAN utilitzant un altre sentencia UPDATE amb una subconsulta.  Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''4.''' Se't demana que evitis que es suprimeixi als empleats durant les hores laborables.&lt;br /&gt;
&lt;br /&gt;
:a) Escriu un disparador de sentencia anomenat DELETE_EMP_TRG en la taula EMPLOYEES per evitar que les files es suprimeixin durant hores laborables entre setmana, es a dir, de las 9:00 a.m. a las 6:00 p.m.&lt;br /&gt;
&lt;br /&gt;
:b) Intenta suprimir els empleats amb JOB_ID SA_REP que no estiguin assignats a un departamento.&lt;br /&gt;
&lt;br /&gt;
:'''Indicació:''' empleat Grant amb identificador 178.&lt;br /&gt;
&lt;br /&gt;
==Creació de disparadors compostos, de DDL i d'events de base de dades==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, implantaràs una regla de negoci senzilla per garantir la integritat de les dades dels salaris dels empleats respecte al rang de salaris vàlids per als seus treballs. Crea un disparador per a aquesta regla. Durant aquest procés, els nous&lt;br /&gt;
disparadors donaran lloc a un efecte en cascada amb disparadors creats en la secció pràctica de la lliçó anterior. L'efecte en cascada originarà una excepció de taula mutant en la taula JOBS. A continuació, crea un paquet PL/SQL i disparadors addicionals per resoldre el problema de la taula mutant.&lt;br /&gt;
&lt;br /&gt;
'''1.''' Els empleats reben un augment de sou automàticament si el salari mínim d'un treball s'augmenta a un valor superior que els seus salaris actuals. Implanta aquest requisit amb un procediment empaquetat al que cridi el disparador de la taula JOBS. Quan intenta actualitzar el salari mínim en la tabla JOBS e intenta actualitzar els salaris dels empleats, el disparador CHECK_SALARY intenta llegir la taula JOBS, que està subjecta a canvis i obtindrà una excepció de taula mutant que es resol creant u nou paquet i disparadors addicionals.&lt;br /&gt;
&lt;br /&gt;
:a) Actualitza el paquet EMP_PKG (que vas actualitzà per última vegada en la pràctica 8), de la següent forma:&lt;br /&gt;
&lt;br /&gt;
::i) Agrega un procediment anomenat SET_SALARY, que actualitzi els salaris dels empleats.&lt;br /&gt;
::ii) El procediment SET_SALARY accepta els dos paràmetres següents: el identificador de treball de aquells salaris que pot ser s'hagin d'actualitzar i el nou salari mínim per a l'identificador del treball.&lt;br /&gt;
&lt;br /&gt;
:b) Crea un disparador de fila anomenat UPD_MINSALARY_TRG en la taula JOBS, que cridi al procediment EMP_PKG.SET_SALARY quan el salari mínim de la taula JOBS s'actualitzi per a un identificador de treball especificat.&lt;br /&gt;
&lt;br /&gt;
:c) Escriu una consulta per mostrar l'identificador d'empleat, el cognom, l'identificador de treball, el salari actual i el salari mínim per als empleats que siguin programadors, es a dir, el seu JOB_ID es 'IT_PROG'. A continuació, actualitza el salari mínim en la taula JOBS per a augmentar-lo en 1.000 dòlars. Què succeïx?&lt;br /&gt;
&lt;br /&gt;
'''2.''' Per resoldre el problema de la taula mutant, crea JOBS_PKG per mantenir en memòria una copia de les files de la taula JOBS. A continuació, modifica el procediment CHECK_SALARY per utilitzar les dades del paquet en lloc d'emetre una consulta en una taula mutant per evitar la excepció. Hauràs de crear crear un disparador de sentencia BEFORE INSERT OR UPDATE en la taula EMPLOYEES per inicialitzar l'estat del paquet JOBS_PKG abans de que arranqui el disparador de fila CHECK_SALARY.&lt;br /&gt;
&lt;br /&gt;
:a) Crea un nou paquet anomenat JOBS_PKG amb la següent especificació:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    PROCEDURE initialize;&lt;br /&gt;
    FUNCTION get_minsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    FUNCTION get_maxsalary(jobid VARCHAR2) RETURN NUMBER;&lt;br /&gt;
    PROCEDURE set_minsalary(jobid VARCHAR2,min_salary NUMBER);&lt;br /&gt;
    PROCEDURE set_maxsalary(jobid VARCHAR2,max_salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:b) Implanta el cos de JOBS_PKG, com es detalla a continuació:&lt;br /&gt;
&lt;br /&gt;
::i) Declara una taula d'índex PL/SQL privada anomenada jobs_tab_type indexada per un tipus de cadena basada en JOBS.JOB_ID%TYPE.&lt;br /&gt;
&lt;br /&gt;
::ii) Declara una variable privada anomendad jobstab basada en jobs_tab_type.&lt;br /&gt;
&lt;br /&gt;
::iii) El procediment INITIALIZE llegeix les files en la taula JOBS amb un bucle de cursor y utilitza el valor JOB_ID per al índex jobstab que se li assigni a la fila corresponent.&lt;br /&gt;
&lt;br /&gt;
::iv) La funció GET_MINSALARY utilitza un paràmetre p_jobid com a índex per a jobstab i retorna min_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::v) La funció GET_MAXSALARY utilitza un paràmetre p_jobid com a índex per a jobstab y retorna max_salary per a aquest element.&lt;br /&gt;
&lt;br /&gt;
::vi) El procediment SET_MINSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp min_salary del seu element en el valor del paràmetre min_salary.&lt;br /&gt;
&lt;br /&gt;
::vii) El procediment SET_MAXSALARY utilitza su p_jobid com a índex per a jobstab amb el fi de definir el camp max_salary del seu element en el valor del paràmetre max_salary.&lt;br /&gt;
&lt;br /&gt;
:c) Copia el procediment CHECK_SALARY de la pràctica 10, exercici 1a, i modifica el codi substituint la consulta de la taula JOBS amb  sentencies per definir les variables locals minsal y maxsal amb valors de les dades JOBS_PKG cridant a les funcions GET_*SALARY adequades. Aquest pas ha d'eliminar l'excepció de disparador mutant.&lt;br /&gt;
&lt;br /&gt;
:d) Implanta un disparador de sentencia BEFORE INSERT OR UPDATE anomenat INIT_JOBPKG_TRG que utilitzi la sintaxis CALL per cridar al procediment JOBS_PKG.INITIALIZE, amb la finalitat de garantir que l'estat del paquet sigui actual abans de que es realitzin les operacions DML.&lt;br /&gt;
&lt;br /&gt;
:e) Prova els canvis de codi executant la consulta per mostrar els empleats que son programadors i, a continuació, emet una sentencia de actualització per augmentar el salari mínim del tipus de treball IT_PROG en 1.000 en la taula JOBS. Després d'això, realitza una consulta dels empleats amb el tipus de treball IT_PROG per comprovar els canvis resultants. Els salaris de què empleats s'han definit en el mínim per als seus treballs?&lt;br /&gt;
&lt;br /&gt;
'''3.''' Donat que CHECK_SALARY_TRG arranca el procediment CHECK_SALARY, abans d'afeir o actualitzar un empleat, has de comprovar si encara funciona com s'esperava.&lt;br /&gt;
&lt;br /&gt;
:a) Prova'l agregant un nou empleat mitjançant EMP_PKG.ADD_EMPLOYEE amb els següents paràmetres: (‘Steve’,‘Morse’, ‘SMORSE’, and sal =&amp;gt; 6500). Què succeïx?&lt;br /&gt;
&lt;br /&gt;
:b) Per corregir el problema trobat al afegir o actualitzar un empleat:&lt;br /&gt;
&lt;br /&gt;
::i) Crea un disparador de sentencia BEFORE INSERT OR UPDATE anomenat EMPLOYEE_INITJOBS_TRG en la taula EMPLOYEES que cridi al procediment JOBS_PKG.INITIALIZE.&lt;br /&gt;
&lt;br /&gt;
::ii) Utilitza la sintaxis CALL en el cos del disparador.&lt;br /&gt;
&lt;br /&gt;
:c) Prova el disparador afegint l'empleat Steve Morse de nou. Confirma el registre afegint en la taula EMPLOYEES mostrant l'identificador d'empleat, el nom i el cognom, el salari, l'identificador de treball i el identificador de departament.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T1 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T2 | Creació de funcions i depuració de subprogrames]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T3 | Creació i ús de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T4 | Treballar amb paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Ús del paquet UTL_FILE]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T8 | Creació de disparadors]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T9 | Creació de disparadors compostos]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T6 | Creació d'estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T7 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL-2 T12 | Creació de funcions]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18860</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18860"/>
				<updated>2025-02-19T14:22:26Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18859</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18859"/>
				<updated>2025-02-19T14:22:01Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18858</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18858"/>
				<updated>2025-02-19T14:21:16Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18807</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18807"/>
				<updated>2025-01-27T15:32:39Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18806</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18806"/>
				<updated>2025-01-27T15:32:00Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18805</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18805"/>
				<updated>2025-01-27T15:31:12Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18782</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18782"/>
				<updated>2025-01-24T13:46:27Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18781</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18781"/>
				<updated>2025-01-24T13:45:43Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18780</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18780"/>
				<updated>2025-01-24T13:44:22Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18779</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18779"/>
				<updated>2025-01-24T13:43:31Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18778</id>
		<title>M2 - Bases de dades / Exercicis UF3: PL-SQL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF3:_PL-SQL&amp;diff=18778"/>
				<updated>2025-01-24T13:42:24Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introducció a PL/SQL==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Quin bloc PL/SQL dels següents s'executa correctament?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     a) BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     b) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        END;&lt;br /&gt;
     c) DECLARE&lt;br /&gt;
        BEGIN&lt;br /&gt;
        END;&lt;br /&gt;
     d) DECLARE&lt;br /&gt;
          v_amount INTEGER(10);&lt;br /&gt;
        BEGIN&lt;br /&gt;
          DBMS_OUTPUT.PUT_LINE(v_amount);&lt;br /&gt;
        END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea i executa un bloc anònim simple, la seva sortida ha de ser “Hello World”. Executa i guarda aquest sript com lab_01_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
==Declaració de variables ==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Especifica identificadors vàlids i no vàlids:&lt;br /&gt;
&lt;br /&gt;
:a) today&lt;br /&gt;
:b) last_name&lt;br /&gt;
:c) today’s_date&lt;br /&gt;
:d) Number_of_days_in_February_this_year&lt;br /&gt;
:e) Isleap$year&lt;br /&gt;
:f) #number&lt;br /&gt;
:g) NUMBER#&lt;br /&gt;
:h) number1to7&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Identifica les declaracions e inicialitzacions de variables vàlides i no vàlides:&lt;br /&gt;
&lt;br /&gt;
:a) number_of_copies&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;PLS_INTEGER;&lt;br /&gt;
:b) PRINTER_NAME&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;constant VARCHAR2(10);&lt;br /&gt;
:c) deliver_to&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;VARCHAR2(10):=Johnson;&lt;br /&gt;
:d) by_when&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;DATE:= CURRENT_DATE+1;&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Examina el següent bloc anònim i selecciona la frase que serà certa de entre les següents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DECLARE&lt;br /&gt;
    v_fname VARCHAR2(20);&lt;br /&gt;
    v_lname VARCHAR2(15) DEFAULT 'fernandez';&lt;br /&gt;
  BEGIN&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(v_fname ||' ' ||v_lname);&lt;br /&gt;
  END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) El bloc s'executa correctament i s'imprimeix “fernandez”.&lt;br /&gt;
:b) El bloc produeix un error perquè s'utilitza la variable fname sense inicialitzar-se.&lt;br /&gt;
:c) El bloc s'executa correctament i s'imprimeix &amp;quot;null fernandez&amp;quot;.&lt;br /&gt;
:d) El bloc produeix un error perquè no es pot utilitzar la paraula clau DEFAULT per inicialitzar una variable de tipus VARCHAR2.&lt;br /&gt;
:e) El bloc produeix un error perquè no es declara la variable v_fname.&lt;br /&gt;
&lt;br /&gt;
'''4.-''' Modifica un bloc anònim existent i guarda'l com un nou script.&lt;br /&gt;
&lt;br /&gt;
:a) Obre el script lab_01_02_soln.sql, creat en la Pràctica 1.&lt;br /&gt;
:b) En aquest bloc PL/SQL, declara las següents variables:&lt;br /&gt;
::1. v_today del tipus DATE. Inicialitza today amb SYSDATE.&lt;br /&gt;
::2. v_tomorrow del tipus today. Utilitza l'atribut %TYPE per declarar aquesta variable.&lt;br /&gt;
:c) En la secció executable:&lt;br /&gt;
::1. Inicialitza la variable v_tomorrow amb una expressió, que calculi la data de demà (agrega un 1 al valor de today)&lt;br /&gt;
::2. Imprimeix el valor de v_today i tomorrow desprès de imprimir “Hello World”&lt;br /&gt;
:d) Guarda el script com a lab_02_04_soln.sql i executa'l.&lt;br /&gt;
&lt;br /&gt;
:La sortida de l'exemple és com la següent (els valors de v_today i v_tomorrow seran diferents per reflexar la data actual d'avui i la de demà):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello World&lt;br /&gt;
         TODAY IS : 07-MAR-16&lt;br /&gt;
         TOMORROW IS: 08-MAR-16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''5.-''' Edita el script lab_02_04_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Agrega codi per crear dues variables d'enllaç: b_basic_percent i b_pf_percent. Ambdues de tipus NUMBER.&lt;br /&gt;
:b) En la secció executable del bloc PL/SQL, assigna els valors 45 i 12 a b_basic_percent i b_pf_percent, respectivament.&lt;br /&gt;
:c) Termina el bloc PL/SQL amb “/” i mostra el valor de las variables d'enllaç amb l'ordre PRINT.&lt;br /&gt;
:d) Executa i guarda el script com a lab_02_05_soln.sql. La sortida de exemple és la següent:&lt;br /&gt;
­&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
         b_basic_percent&lt;br /&gt;
         --&lt;br /&gt;
         45&lt;br /&gt;
&lt;br /&gt;
         b_pf_percent&lt;br /&gt;
         --&lt;br /&gt;
         12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Escriptura de Sentències Executables ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, examinaràs i escriuràs sentències executables.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_1.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Avalua el bloc PL/SQL anterior i determina el tipus de dada i el valor de cada una de les següents variables, segons les regles dels àmbits:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_weight en la posició 1:&lt;br /&gt;
:b) Valor de v_new_locn en la posició 1:&lt;br /&gt;
:c) Valor de v_weight en la posició 2:&lt;br /&gt;
:d) Valor de v_message en la posició 2:&lt;br /&gt;
:e) Valor de v_new_locn en la posició 2:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_ESE_2.png |600px|center| Escriptura de Sentències Executables]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En el bloc anterior, determina el valor i el tipus de dada en cada un dels següents cassos:&lt;br /&gt;
&lt;br /&gt;
:a) Valor de v_customer en el bloc anidat:&lt;br /&gt;
:b) Valor de v_name en el bloc anidat:&lt;br /&gt;
:c) Valor de v_credit_rating en el bloc anidat:&lt;br /&gt;
:d) Valor de v_customer en el bloc principal:&lt;br /&gt;
:e) Valor de v_name en el bloc principal:&lt;br /&gt;
:f) Valor de v_credit_rating en el bloc principal:&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Utilitza la mateixa sessió que vas utilitzar per executar les pràctiques de la lliçó anomenada &amp;quot;Declaració de Variables PL/SQL&amp;quot;. Se has obert una nova sessió, executa lab_02_05_soln.sql. A continuació, edita lab_02_05_soln.sql de la siguent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Amb la sintaxis de comentaris d'una sola línia, comenta les línies que creen les variables d'enllaç i activa SERVEROUTPUT.&lt;br /&gt;
:b) Amb els comentaris de varies línies, comenta en la secció executable les línies que assignen valors a les variables d'enllaç.&lt;br /&gt;
:c) En la secció de declaracions:&lt;br /&gt;
::1. Declara e inicialitza dues variables temporals per substituir les variables d'enllaç comentades.&lt;br /&gt;
::2. Declara dues variables addicionals: v_fname de tipus VARCHAR2 i&lt;br /&gt;
tamany 15, i v_emp_sal del tipus NUMBER i tamany 10.&lt;br /&gt;
:d) Inclou la següent sentència SQL en la secció executable:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     SELECT first_name, salary INTO v_fname, v_emp_sal&lt;br /&gt;
     FROM employees WHERE employee_id=110;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:e) Canvia la línia que imprimeix “Hello World” per a que imprimeixi “Hello” i el nom. A continuació, comenta les línies que mostren les dates i les que imprimeixen  les variables d'enllaç.&lt;br /&gt;
:f) Calcula l'aportació de l'empleat al fons de previsió (PF). PF és el 12% del salari bàsic, i el salari bàsic es el 45% del salari. Utilitza les variables locals per fer el càlcul. Intenta utilitza només una expressió per calcular el valor de PF. Imprimeix el salari de l'empleat i la seva aportació a PF.&lt;br /&gt;
:g) Executa i guarda el script com lab_03_03_soln.sql. La sortida de l'exemple és la següent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         anonymous bloc completed&lt;br /&gt;
           Hello Jhon&lt;br /&gt;
         YOUR SALARY IS : 8200&lt;br /&gt;
         YOUR CONTRIBUTION TOWARDS PF: 442.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interacció amb Oracle Server ==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica utilitzarà codi PL/SQL per interactuar amb Oracle Server.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que seleccioni l'identificador de departament superior en la taula departments i l'emmagatzemi en la variable v_max_deptno. Mostra l'identificador de departament superior.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_max_deptno de tipus NUMBER en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Inicia la secció executable amb les paraules BEGIN e inclou una sentència SELECT per recupera el valor màxim de department_id de la taula departments.&lt;br /&gt;
&lt;br /&gt;
:c) Mostra v_max_deptno i finalitza el bloc executable.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script lab_04-01_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_5.png |400px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el bloc PL/SQL creat en el pas 1 per afegir un nou departament en la taula departments.&lt;br /&gt;
&lt;br /&gt;
:a) Carrega el script lab_04_01_soln.sql. Declara dues variables:&lt;br /&gt;
::v_dept_name de tipus departments.department_name i v_dept_id de tipo NUMBER&lt;br /&gt;
::Assigna 'Eduction' a v_dept_name en la secció de declaracions.&lt;br /&gt;
&lt;br /&gt;
:b) Ja has recuperat el número de departament superior actual de la taula departments. Suma-li 10 i assigna-li el resultat a v_dept_id.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència INSERT per insertar dades en les columnes department_name, department_id y location_id de la taula departments.&lt;br /&gt;
:Utilitza valors en dept_name i dept_id per a department_name i department_id, respectivament, i utilitza NULL per a location_id.&lt;br /&gt;
&lt;br /&gt;
:d) Utilitza l'atribut SQL SQL%ROWCOUNT per mostrar el número de files que es veuen afectades.&lt;br /&gt;
&lt;br /&gt;
:e) Executa una sentència SELECT per comprovar si s'ha afegit el nou departament. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT en el script.&lt;br /&gt;
&lt;br /&gt;
:f) Executa i guarda el script com lab_04_02_soln.sql. La sortida d'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_6.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' En el pas 2, defineix location_id en NULL. Crea un bloc PL/SQL que actualitzi location_id a 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:a) Inicia el bloc executable amb la paraula clau BEGIN. Inclou la sentència UPDATE per definir location_id en 3000 per al nou departament.&lt;br /&gt;
&lt;br /&gt;
:b) Acaba el bloc executable en la paraula clau END. Acaba el bloc PL/SQL amb &amp;quot;/&amp;quot; e inclou una sentència SELECT per mostrar el departament que ha actualitzat.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una sentència DELETE per suprimir el departament agregat.&lt;br /&gt;
&lt;br /&gt;
:d) Executa i guarda el script com lab_04_03_soln.sql. La sortida de l'exemple és la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_7.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ADDICIONALS'''&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 1'''&lt;br /&gt;
&lt;br /&gt;
Per a aquest exercici, es necessita una taula temporal per emmagatzemar els resultats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea la taula descrita a continuació:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_1.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE TEMP(&lt;br /&gt;
  NUM_STORE NUMBER(7,2),&lt;br /&gt;
  CHAR_STORE VARCHAR2(35),&lt;br /&gt;
  DATE_STORE DATE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Escriu un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) Declara dues variables i assigna el següents valors a aquestes variables: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_2.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:b) Emmagatzema els valors d'aquestes variables en les columnes adients de la tabla TEMP.&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Verifica els resultats consultant la taula TEMP. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_3.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
'''EXERCICI 2'''&lt;br /&gt;
&lt;br /&gt;
En aquest exercici, utilitzaràs dades de la taula employees.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per determinar el nombre d'empleats que treballen en un determinat departament. El bloc PL/SQL haurà de:&lt;br /&gt;
&lt;br /&gt;
:* Utilitzar una variable de substitució per emmagatzemar un número de departament&lt;br /&gt;
:* Imprimir el nombre de persones que treballen en el departament especificat&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Quan s'execute el bloc , apareixerà una finestra de variable de substitució. Introdueix un número de departament vàlid i fes clic en OK. La sortida resultant haurà de tenir un aspecte similar al següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_IOS_4.png |600px|center| Interacció Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
==Escriptura de les estructures de control==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, crearàs blocs PL/SQL que incorporin bucles i estructures de control condicionals. En aquesta pràctica es comprovarà el teu coneixement de varies sentències IF i construccions L00P.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Executa l'ordre en l'arxiu lab_05_01.sql per crear la taula messages.&lt;br /&gt;
Escriu un bloc PL/SQL per afegir números en la taula messages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CREATE TABLE messages(&lt;br /&gt;
    results VARCHAR2(100));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Afegeix el números del 1 al 10, excloent el 6 i el 8.&lt;br /&gt;
:b) Confirma abans del final de bloc.&lt;br /&gt;
:c) Executa la sentència SELECT per verificar que el bloc PL/SQL ha funcionat.&lt;br /&gt;
&lt;br /&gt;
:Resultat: has de veure la següent sortida:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_1.png |300px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Executa el script lab_05_=2.sql. Aquest script crea una taula emp, que és una replica de la taula employees. Modifica la taula emp per agegir una nova columna, stars, de tipus de dades VARCHAR2 i una mida de 50. Crea un bloc PL/SQL que afegeixi un asterisc en la columna stars per cada $1000 del salari de l'empleat. Guarda aquest script com lab_05_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   CREATE TABLE employees2&lt;br /&gt;
   AS&lt;br /&gt;
   SELECT *&lt;br /&gt;
   FROM employees;&lt;br /&gt;
&lt;br /&gt;
   ALTER TABLE employees2 &lt;br /&gt;
   ADD (stars VARCHAR2(50));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions del bloc, declara una variable v_empno del tipus employees2.employee_id e inicialitza-la en 176. Declara una variable v_asterisk del tipus emp.stars e inicialitza-la en NULL. Crea una variable v_sal del tipus emp.salary.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, escriu lògica per afegir un asterisc (*) a la cadena per cada 1000 dòlars del salari. Per exemple, si l'empleat guanya 8000 dòlars, la cadena d'asteriscs ha d'incloure vuit asteriscs. Si l'empleat guanya 12500 dòlars, la cadena d'asteriscs ha d'incloure 13 asteriscs.&lt;br /&gt;
&lt;br /&gt;
:c) Actualitza la columna stars per a l'empleat amb la cadena d'asteriscs.&lt;br /&gt;
:Confirma abans del final del bloc.&lt;br /&gt;
&lt;br /&gt;
:d) Mostra la fila de la taula emp per verificar que el bloc PL/SQL s'ha executat correctament.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_05_02_soln.sql. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_EEC_2.png |450px|center| Escriptura de les estructures de control]]&lt;br /&gt;
&lt;br /&gt;
==Treballar amb tipus de dades compostes==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Escriu un bloc PL/SQL per imprimir informació sobre un país determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Declara una variable v_countryid. Assigna-li CA a v_countryid.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, utilitza l'atribut %ROWTYPE i declara la variable v_countryid_record del tipus countries.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obté tota la informació de la taula countries mitjançant v_countryid. Mostra la informació seleccionada sobre el país. la sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_1.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Executa el bloc PL/SQL pels països amb els identificadors DE, UK i US.&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Crea un bloc PL/SQL per recuperar els noms d'alguns departaments de la taula departments e imprimir el nom de cada departament en la pantalla, incorporant una matriu associativa. Guarda el script com lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:a) Declare una taula INDEX BY dept_table_type del tipus departments.department_name. Declara una variable my_dept_table del tipus dept_table_type per emmagatzema temporalment els noms dels departaments.&lt;br /&gt;
&lt;br /&gt;
:b) Declara dues variables: f_loop_count i v_deptno del tipus NUMBER. Assigna 10 a f_loop_count i 0 a v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) Amb un bucle, recupera els noms de 10 departaments i emmagatzema'ls en la matriu associativa. Comença pel department_id 10. Augmentav_deptno en 10 per a cada interacció de bucle. La següent taula mostra els valors department_id per als que cal recuperar department_name.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_2.png |450px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar els noms dels departaments de la matriu associativa i mostrar-los.&lt;br /&gt;
&lt;br /&gt;
:e) Executa i guarda el script com a lab_06_02_soln.sql. La sortida és la segúent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_3.png |200px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Modifica el bloc creat en la Pràctica 2 per recuperar tota la informació de cada departament de la taula departments i mostra-la. Utilitza una matriu associativa amb el mètode de taula de registres INDEX BY.&lt;br /&gt;
&lt;br /&gt;
:a) Carga el script lab_06_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:b) Has declarat que la matriu associativa sigui del tipus departments.department_name. Modifica la declaració de la matriu associativa per emmagatzemar temporalment el número, el nom i la ubicació de tots els departaments. Utilitza l'atribut %ROWTYPE. &lt;br /&gt;
&lt;br /&gt;
:c) Modifica la sentència SELECT per recuperar tota la informació del departament que està en la taula departments i emmagatzemar-la en la matriu associativa.&lt;br /&gt;
&lt;br /&gt;
:d) Si utilitzes un altre bucle, pots recuperar la informació dels departaments de la matriu associativa i mostrar-la.&lt;br /&gt;
&lt;br /&gt;
: La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_TDC_4.png |550px|center| Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
==Us de cursors explícits==&lt;br /&gt;
&lt;br /&gt;
En aquest tema, resoldràs dos exercicis:&lt;br /&gt;
* Primer, utilitzaràs un cursor explícit per processar un nombre de files d'una taula i omplir una altra taula amb els resultats mitjançant un bucle FOR de cursos.&lt;br /&gt;
* Desprès, escriuràs un bloc PL/SQL que processi la informació amb dos cursors, incloent un que utilitzi un paràmetre.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' Crea un bloc PL/SQL que realitzi les següents accions:&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara e inicialitza una variable anomenada v_deptno de tipus NUMBER. Assigna-li un valor de departament vàlid (consulta els valors de la taula del pas d).&lt;br /&gt;
&lt;br /&gt;
:b) Declara un cursor anomenat c_emp_cursor, que recuperi last_name, salary i mangager_id dels empleats que treballen en el departament especificat en v_deptno.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, utilitza el bucle FOR de cursor per realitzar operacions en les dades recuperades. Si el salari de l'empleat es menor que 5000 i el identificador de su superior (manager_id) es 101 0 124, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Due for a raise&amp;quot;. En cas contrari, apareix el missatge &amp;quot;&amp;lt;&amp;lt;last_name&amp;gt;&amp;gt; Not Due for a raise&amp;quot;&lt;br /&gt;
&lt;br /&gt;
:d) Prova el bloc PL/SQL per als següents cassos:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_1.png |400px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' A continuació, escriu un bloc PL/SQL que declari i utilitzi dos cursors: un sense paràmetre i un altre amb paràmetre. El primer cursor recupera el número de departament i el nom del departament de la taula departaments per a tots els departaments que tinguin un identificador menor que 100. El segon cursor rep el número de departament com a paràmetre i recupera els detalls dels empleats que treballen en aquest departament i amb un employee_id menor de 120.&lt;br /&gt;
&lt;br /&gt;
:a) Declara un cursor c_dept_cursor per reuperar department_id i department_name per als departaments amb department_id menor que 100. Ordena per department_id.&lt;br /&gt;
&lt;br /&gt;
:b) Declara un altre cursor c_emp_curosr que prengui el número de departament com a paràmetre i recuperi les següents dades: last_name, job_id, hire_date i salary dels empleats que treballen en aquest departament, amb employee_id inferior a 120.&lt;br /&gt;
&lt;br /&gt;
:c) Declara les variables que contenen els valors recuperats de cada cursor. Utilitza l'atribut %TYPE per declara les variables.&lt;br /&gt;
&lt;br /&gt;
:d) Obre c_dept_cursor, utilitza un bucle simple i recupera els valors en les variables declarades. Mostra el número i el nom del departament. Utilitza l'atribut de cursor adequat per sortir del bucle.&lt;br /&gt;
&lt;br /&gt;
:e) Obre c_emp_cursor transferint el número de departament actual com a paràmetre. Inicia un altre bucle i recupera els valors de emp_cursor en les variables e imprimeix tots els detalls recuperats en la taula employees.&lt;br /&gt;
&lt;br /&gt;
:'''Nota'''&lt;br /&gt;
:* Comprova si c_emp_cursor ja està obert abans d'obrir-lo.&lt;br /&gt;
:* Utilitza l'atribut de cursor adequat per a la condició de sortida.&lt;br /&gt;
:* Quan termina el bucle, imprimeix una línia desprès de haver mostrat els detalls de cada departament i tanca c_emp_cursor.&lt;br /&gt;
&lt;br /&gt;
:f) Finalitza el primer bucle i tanca c_dept_cursor. A continuació, finalitza la secció executable.&lt;br /&gt;
&lt;br /&gt;
:g) Executa el script. La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_2.png |550px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
'''3.-''' Crea un bloc PL/SQL que utilitzi un cursor explícit per determinar los n salaris més alts dels empleats.&lt;br /&gt;
&lt;br /&gt;
:a) Executa el scrilpt lab_07-2.sql per crear la taula top_salaries per emmagatzemar els salaris dels empleats.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;SQL&amp;quot;&amp;gt;&lt;br /&gt;
  CREATE TABLE top_salaries(&lt;br /&gt;
    salary NUMBER(7,2));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
:b) En la secció declaracions, declara la variable v_num del tipus NUMBER que contengui el número n, que representa els n salaris més alts de la taula employees. Per exemple, per veure els cinc salaris més alts de la taula, introdueix un 5. Declara un altra variable sal del tipus employees.salary. Declara un cursor, c_emp_cursor, que recuperi els salaris dels empleats en ordre descendent.&lt;br /&gt;
: Recorda que els salaris no han de estar duplicats.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, obre un bucle, recupera els n salaris principals e afegeix-los a la taula top_salaris. Pots utilitzar un bucle simple per realitzar operacions amb les dades. A més a més, utilitza els atributs %ROWCOUNT i %FOUND per a la condició de sortida.&lt;br /&gt;
&lt;br /&gt;
:'''Nota:''' assegura't d'agregar una condició de sortida per evitar un bucle infinit.   &lt;br /&gt;
&lt;br /&gt;
:d) Desprès d'afegir-los en la taula top_salaries. mostra les files amb una sentència SELECT. La sortida que es mostra presenta els cinc salaris més alts de la taula employees.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_UCE_3.png |200px|center| Us de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:e) Prova diferents cassos especials, com v_num = 0 o amb un v_num més gran que el nombre d'empleats de la taul employees. Buida la taula top_salaries després de cada prova.&lt;br /&gt;
&lt;br /&gt;
==Maneig d'excepcions predefinides==&lt;br /&gt;
&lt;br /&gt;
'''1.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que apliqui una excepció predefinida per a processar un únic registre a la vegada. El bloc PL/SQL seleccionarà el nom de l'empleat amb un valor de salari determinat.&lt;br /&gt;
&lt;br /&gt;
:a) Executa l'odre de l'arxiu lab_05_01.sql per tornar a crear la taula messages.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció de declaracions, declara dues variables: v_ename de tipus employees.last_name i v_emp_sal del tipus employees.salary.&lt;br /&gt;
:Inicialitza l'última en 6000.&lt;br /&gt;
&lt;br /&gt;
:c) En la secció executable, recupera els cognoms dels empleats amb salaris iguals al valor de v_emp_sal. Si el salari introduït torna només una fila, afegeix en la taula messages el nom i el import del salari de l'empleat.&lt;br /&gt;
:'''Nota:''' no utilitzis cursors explícits.&lt;br /&gt;
&lt;br /&gt;
:d) Si el salari introduït no torna cap fila, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;No employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:e) Si el salari introduït torna varies files, manega l'excepció amb un manegador d'excepcions adequat i afegeix en la taula messages el missatge &amp;quot;More than one employee with a salary of &amp;lt;salary&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:f) Manega qualsevol altra excepció amb un manegador d'excepcions adequat i afegix en la taula messages el missatge &amp;quot;Some other error ocurred&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:g) Mostra les files de la taula messages per comprovar si el bloc PL/SQL s'ha executat correctament. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_1.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:h) Canvia el valor inicialitzat de v_emp_sal a 2000 i torna a executar. La sortida és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_2.png |300px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' En aquesta pràctica, escriuràs un bloc PL/SQL que declari una excepció per a l'error de Oracle Server ORA-02292 (integrity constraint violated - child record found). El bloc comprovarà l'excepció i mostrarà el missatge d'error.&lt;br /&gt;
&lt;br /&gt;
:a) En la secció de declaracions, declara una excepció e_childrecord_exists.&lt;br /&gt;
:Associa l'excepció declarada al error d'Oracle Server estàndard -02292.&lt;br /&gt;
&lt;br /&gt;
:b) En la secció executable, mostra &amp;quot;Deleting department 40...&amp;quot;. Inclou una sentència DELETE per suprimir el departament amb department_id 40.&lt;br /&gt;
&lt;br /&gt;
:c) Inclou una secció d'excepcions per manegar l'excepció e_childrecord_exists i mostra el missatge adequat.&lt;br /&gt;
&lt;br /&gt;
:La sortida d'exemple és la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_MEP_3.png |500px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
==Creació i us de procediments emmagatzemats==&lt;br /&gt;
&lt;br /&gt;
En aquesta pràctica, modificaràs scripts existents per crear i utilitzar procediments emmagatzemats.&lt;br /&gt;
&lt;br /&gt;
'''1.-''' A partir de l'exercici 4 del tema2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   DECLARE&lt;br /&gt;
     v_today DATE:=SYSDATE;&lt;br /&gt;
     v_tomorrow v_today%TYPE;&lt;br /&gt;
   BEGIN&lt;br /&gt;
     v_tomorrow:=v_today +1;&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE(' Hello World ');&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TODAY IS : '|| v_today);&lt;br /&gt;
     DBMS_OUTPUT.PUT_LINE('TOMORROW IS : ' || v_tomorrow);&lt;br /&gt;
   END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:a) Modifica el script per convertir el bloc anònim en un procediment anomenat greet. ('''Indicació:''' elimina també l'ordre SET SERVEROUTPUT ON).&lt;br /&gt;
&lt;br /&gt;
:b) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_1.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:c) Guarda aquest script com lab_09_01_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:d) Prem el botó Clear per netejar l'espai de treball.&lt;br /&gt;
&lt;br /&gt;
:e) Crea i executa un bloc anònim per cridar al procediment greet.&lt;br /&gt;
:('''Indicació:' assegura't d'activa SERVEROUTPUT al principi del bloc).&lt;br /&gt;
&lt;br /&gt;
:La sortida ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_2.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
'''2.-''' Modifica el script lab_09_01_soln.sql de la següent forma:&lt;br /&gt;
&lt;br /&gt;
:a) Elimina el procediment greet amb la següent ordre:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     DROP PROCEDURE greet;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:b) Modifica el procediment per acceptar un argument de tipus VARCHAR2&lt;br /&gt;
:anomena al argument p_name. &lt;br /&gt;
&lt;br /&gt;
:c) Imprimeix Hello ''&amp;lt;name&amp;gt;'' (es a  dir, el contingut de l'argument) en lloc de Hello World. &lt;br /&gt;
&lt;br /&gt;
:d) Guarda el script com lab_09_02_soln.sql.&lt;br /&gt;
&lt;br /&gt;
:e) Executa el script per crear el procediment. La sortida resultant ha de ser com la següent: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_3.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&lt;br /&gt;
:f) Crea i executa un bloc anònim per cridar el procediment greet amb un valor de paràmetre. El bloc també ha de produir la sortida.&lt;br /&gt;
&lt;br /&gt;
:La sortida del exemple ha de ser similar a la següent:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:M2UF3_PE_4.png |250px|center| Maneig d'excepcions predefinides]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==T5- Interacció amb el servidor Oracle ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que seleccioni el departament amb el número més alt de la taula DEPT i mostri els resultats per pantalla.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea bloc PL/SQL que insereixi un nou departament en la taula DEPT, com a número de departament utilitza el recuperat en l'apartat anterior més 10.&lt;br /&gt;
&lt;br /&gt;
Utilitza una variable de substitució per el nom de departament i deixa la ubicació com a nula. Finalment mostra el nou departament creat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc plsql que actualitzi la ubicació d'un departament existent. Guarda el bloc en un arxiu anomenat “t5p3.sql”.&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) crea un altre paràmetre per a guardar la nova ubicació del departament&lt;br /&gt;
&lt;br /&gt;
c) executa el bloc i actualitza la ubicació d'un departament&lt;br /&gt;
&lt;br /&gt;
e) comprova que s'ha actualitzat correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que suprimeixi el departament creat en l'exercici 2.Guarda el bloc en un arxiu anomenat “t5p4.sql”&lt;br /&gt;
&lt;br /&gt;
a) crea un paràmetre per a guardar el número de departament introduit&lt;br /&gt;
&lt;br /&gt;
b) imprimeix per pantalla el número de files afectades&lt;br /&gt;
&lt;br /&gt;
c) què passa si introduïu un número de departament inexistent?&lt;br /&gt;
&lt;br /&gt;
d) confirma que el departament s'ha suprimit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==T6- Creació d'estructures de control ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
crear una nova taula anomenada MESSAGES per emmagatzemar en una columna anomenada RESULTS cadenes de caràcters de longitud màxima 60 caràcters.&lt;br /&gt;
&lt;br /&gt;
a) crea un bloc per insertar els números del 1 al 10 excepte el 6 i el 8&lt;br /&gt;
&lt;br /&gt;
b) fes un COMMIT al final del bloc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crear un nou bloc plsql per a calcular l'import de la comissió d'un empleat, aquesta comissió dependrà del sou de l'empleat.&lt;br /&gt;
&lt;br /&gt;
a) Inserta un nou empleat en la taula EMP que tingui un sou NULL.&lt;br /&gt;
&lt;br /&gt;
b) Crea una variable per tal d'emmagatzemar el número de l'empleat introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
c) si el sou d'aquest empleat és inferior a 1000$ l'import de la comissió serà un 10% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
d) si el sou d'aquest empleat està entre 1000$ i 1500$ l'import de la comissió serà un 15% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
e) si el sou d'aquest empleat és superior a 1500$ l'import de la comissió serà un 20% d'aquest sou.&lt;br /&gt;
&lt;br /&gt;
f) si el sou d'aquest empleat és NULL la comissió serà un 0.&lt;br /&gt;
&lt;br /&gt;
g) comprova el funcionament d'aquest bloc per cadadascun dels casos anteriors.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 1 per afegir al costat del número parell o imparell en funció de si aquest és parell o imparell.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
Afegiu una nova columna a la taula EMP per afegirs asteriscs “*”&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 5'''&lt;br /&gt;
&lt;br /&gt;
Crea un bloc PL/SQL que introdueixi en la columna creada anteriorment un asterisc per cada 100$ d'un empleat seleccionat per teclat al introduir el seu número d'empleat. Arrodoniu el sou fins el número enter més proper.&lt;br /&gt;
&lt;br /&gt;
==T7- Tipus de dades compostes ==&lt;br /&gt;
&lt;br /&gt;
Crea una nova taula per emmagatzemar salaris i sous.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SQL&amp;gt; CREATE TABLE top_dogs&lt;br /&gt;
  2  (name    VARCHAR2(25),&lt;br /&gt;
  3   salary  NUMBER(11,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL que inicialitzi les 3 primeres posicions d'una taula de registres (nom, salari) i a continuació actualitzi la taula top_dogs amb aquesta informació. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PL/SQL per recuperar el nom i el sou d'un empleat concret de la taula EMP a partir de la introducció del seu número d'empleat.&lt;br /&gt;
&lt;br /&gt;
a. Declara dues taules: rev_salary_table per emmagatzemar el percentatge de augment de salari. i emp_table per guardar l'empleat tractat.&lt;br /&gt;
&lt;br /&gt;
b. Inicialitza les posicions, corresponents als números de departament de la taula dept, amb els diferents percentatges:&lt;br /&gt;
&lt;br /&gt;
       10 --  2; 20 -- 3; 30 -- 4; 40 -- 3 ...&lt;br /&gt;
&lt;br /&gt;
c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
d. Finalment guarda en la taula top_dogs el nom de l'empleat i el seu salari revisat en funció del departament al que pertany.&lt;br /&gt;
&lt;br /&gt;
==T8- Cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Previ: buida la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
Crea un bloc pl/sql que determini els n empleats amb sous més alts (suposeu que no hi ha dos empleats o més amb el mateix sou):&lt;br /&gt;
&lt;br /&gt;
a. obtenir un numero &amp;quot;n&amp;quot; entrat per teclat per l'usuari amb un paràmetre de substitució.&lt;br /&gt;
&lt;br /&gt;
b. en un bucle, obtenir els cognoms  i sous d'aquests &amp;quot;n&amp;quot; empleats de la taula EMP&lt;br /&gt;
&lt;br /&gt;
c. guarda aquestes dades en la taula TOP_DOGS.&lt;br /&gt;
&lt;br /&gt;
d. Suposa que no hi ha dos empleats amb al mateix sou.&lt;br /&gt;
&lt;br /&gt;
e. comprova varis casos: n=0 i n més gran que el número màxim d'empleats.&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Considera el cas de que varis empleats tinguin el mateix salari. Al igual que l'exercici anterior crea un bloc pl/sql que determini els n empleats amb sous més alts, però en aquest cas si se cal mostrar totes les persones que tinguin un mateix sou.&lt;br /&gt;
&lt;br /&gt;
a. Si l'usuari introdueix n=2 han d'aparèixer tres registres (king, ford i scott, aquest últims tenen el mateix sou.&lt;br /&gt;
&lt;br /&gt;
b. Si l'usuari introdueix n=3 han d'aparèixer 4 registres (king, ford i scott i jones).&lt;br /&gt;
&lt;br /&gt;
c. Buida totes les files de la taula TOP_DOGS abans de prova l'exercici.&lt;br /&gt;
&lt;br /&gt;
==T9- Conceptes avançats de cursors explícits ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Ejecute una consulta pera recuperar todos los departamentos y empleados de cada departamento. Inserte los resultados en la tabla MESSAGES.&lt;br /&gt;
&lt;br /&gt;
Utilice un cursor per a recuperar el número de departament i transfieralo a un cursor para recuperar los empleados de este departamento.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  RESULTS&lt;br /&gt;
  -------------------------&lt;br /&gt;
  KING - Department 10&lt;br /&gt;
  CLARK - Department 10&lt;br /&gt;
  MILLER - Department 10&lt;br /&gt;
  JONES - Department 20&lt;br /&gt;
  FORD - Department 20&lt;br /&gt;
  SMITH - Department 20&lt;br /&gt;
  SCOTT - Department 20&lt;br /&gt;
  ADAMS - Department 20&lt;br /&gt;
  BLAKE - Department 30&lt;br /&gt;
  MARTIN - Department 30&lt;br /&gt;
  ALLEN - Department 30&lt;br /&gt;
  TURNER - Department 30&lt;br /&gt;
  JAMES - Departmens 30&lt;br /&gt;
  WARD - Department 30&lt;br /&gt;
  14 rows selected.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici p6q5 per incorporar la funcionalitat FOR UPDATE i WHERE CURRENT OF al procesament de cursors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPNO  SAL   START&lt;br /&gt;
  -----  ----  ----------------&lt;br /&gt;
   8000  &lt;br /&gt;
   7900   950  **********&lt;br /&gt;
   7844  1500  ***************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==T10- Gestió d'excepcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL per seleccionar el nom de l'empleat amb un valor concret de sou. Cal que demanis el sou a l'usuari mitjançant un paràmetre SQL*PLUS. &lt;br /&gt;
&lt;br /&gt;
a. si el sou introduït torna més d'una fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Més d'un empleat amb un sou de &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
b. si el sou introduït no torna cap fila, gestiona l'excepció amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;Cap empleat amb un sou &amp;lt;sou&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
c. si el sou introduït només torna una fila, afegeix a la taula MESSAGES el nom del empleat i l'import del sou.&lt;br /&gt;
&lt;br /&gt;
d. Si es produeix qualsevol altra excepció, gestiona-la amb un manegador d'excepcions apropiat i afegeix a la taula MESSAGES el texte: &amp;quot;S'ha produït algun altre error&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
e. Prova el bloc amb diferents cassos i assegurat de que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Modifica l'exercici 3 del tema 5 t5p3.sql per afegir manegadors d'excepcions definida per l'usuari.&lt;br /&gt;
&lt;br /&gt;
a. escriu un manegador per a que comuniqui missatge a l'usuari dient que el departament especificat no existeix, si és el cas.&lt;br /&gt;
&lt;br /&gt;
b. fes la comprovació amb un departament que no existeixi.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Escriu un bloc PLSQL que imprimeixi els nombre d'empleats que guanyen 100$ més o  menys que un valor introduït per teclat.&lt;br /&gt;
&lt;br /&gt;
a. si no hi ha cap empleat dins aquest rang mostra un missatge al usuari indicant l'error que s'ha produït.&lt;br /&gt;
&lt;br /&gt;
b. si hi ha un o més empleats dins aquests rang el missatge hauria d'indicar quants empleats hi ha en aquest rang de sous.&lt;br /&gt;
&lt;br /&gt;
c. gestiona qualsevol altra excepció indicant que s'ha produït un altre tipus d'error.&lt;br /&gt;
&lt;br /&gt;
==T11- Creació de procediments ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat ADD_PROD per insertar un producte nou a la taula PRODUCT&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, cridar al procediment i consulta la taula PRODUCT per veure els resultats.&lt;br /&gt;
&lt;br /&gt;
c) Crida de nou el procediment, passat l'identificador de producte 100860 ¿què passa i per què?&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat UPD_PROD per actualitzar la descripció d'un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Comprova el control d'excepcions, intentant modificar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment anomenat DEL_PROD per esborrar un producte de la taula PRODUCT. Inclou la manipulació d'excepcions necessària.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i consulta la taula PRODUCT per veure els resultats. Verifica també el control d'excepcions intentant esborrar un producte que no existeix.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
a) Crea un procediment que a partir del codi d'un empleat (empno), recuperi de la taula EMP el seu salari i ofici.&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida al procediment i  visualitza el salari i l'ofici per a l'empleat amb codi 7839·&lt;br /&gt;
&lt;br /&gt;
c) Crida una altra vegada al procediment passant ara el número de empleat 9898. Què passa? Per què?&lt;br /&gt;
&lt;br /&gt;
==T12- Creació de funcions ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció anomenada Q_PROD que retorni la descripció d'un producte a una variable host (una variable global).&lt;br /&gt;
&lt;br /&gt;
b) Compila el codi, crida a la funció i tot seguit consulta la variable host per a veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea una funció emmagatzemada ANNUAL_COMP que ens retorni el salari anual quan li passem el salari mensual i la comissió d'un empleat. La funció ha de retornar el salari anual definit per (sal*12)+comm. Assegura't que la funció controla valors NULL.&lt;br /&gt;
&lt;br /&gt;
b) Utilitza la funció anterior en una sentència SELECT contra la taula EMP.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un procediment, NEW_EMP, per inssertar un empleat nou dins de la taula EMP. El procediment haurà de contenir una crida a la funció VALID_DEPTNO per comprovar si existeix en la taula del departament especificat per al nou empleat.&lt;br /&gt;
&lt;br /&gt;
a) Crea la funció VALID_DEPNO per tal que ens validi un número de departament especificat. La funció ha de retornar un BOOLEÀ.&lt;br /&gt;
&lt;br /&gt;
b) Crea el procediment NEW_EMP per afegir un nou empleat a la taula EMP. S'hauria d'afegir un nou registre a la taula EMP si la funció retorna TRUE. Si retorna FALSE, el procediment hauria d'alertar a l'usuari amb un missatge apropiat.&lt;br /&gt;
Defineix valors DEFAULT per a la majoria d'arguments. La comissió per defecte és 0, el salari per defecte és 1000, el número de departament per defecte és 30, l'ofici per defecte és SALESMAN i el cap per defecte és 7839.&lt;br /&gt;
&lt;br /&gt;
c) Comprova el procediment NEW_EMP afegint un nou empleat (7777) al departament 99 (HARRIS). Deixar la resta de paràmetres amb el seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
d) Comprovar el nou procediment NEW_EMP afegint un nou empleat (8888) al departament 30 (MIKEL). Deixar la resta de paràmetres amb els seus valors per defecte. Quin és el resultat?&lt;br /&gt;
&lt;br /&gt;
==T13- Creació de paquets ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Crea la especificació i el cos d'un paquet anomenat PROD_PACK que contingui els procediments creats ADD_PROD, UPD_PROD i DEL_PROD i la funció Q_PROD.&lt;br /&gt;
&lt;br /&gt;
a) Fer tots els programes públics. (considereu si seguiu necessitant els procediments i funcions empaquetats com objectes independents)&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment DEL_PROD.&lt;br /&gt;
&lt;br /&gt;
c) Consulta la taula PRODUCT per veure el resultat.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
a) Crea l'especificació i el cos d'un paquet anomenat EMP_PACK que contingui els procediment NEW_EMP com a construcció pública i la funció VALID_DEPTNO com a construcció privada.&lt;br /&gt;
&lt;br /&gt;
b) Crida al procediment NEW_EMP utiitzant el valor 99 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
c) Crida al procediment NEW_EMP utiitzant el valor 30 com a número de departament.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
Crea un paquet anomenat CHK_PACK que contingui els procediments  CHK_HIREDATE i CHK_DEPT_MGR. Fes-los com a programes públics.&lt;br /&gt;
&lt;br /&gt;
a) El procediment CHK_HIREDATE comprova si la data de contractació d'un empleat està dins el rang següent (sysdate-50 years, sysdate+3months)&lt;br /&gt;
&lt;br /&gt;
Nota: si la data és invalida ha d'aparèixer un missatge d'error indicant perquè no s'accepta aquesta data. Utilitza una constant per a referir-se al límit de 50 anys. Si el valor de la data de contractació és un valor nul, aquesta serà considerada una data de contractació invalida.&lt;br /&gt;
&lt;br /&gt;
b) El procediment CHK_DEPT_MGR comprova la combinació del departament i del director per a un empleat donat. Això significa que el número de director facilitat ha de ser igual al número de director que supervisa el departament de l'empleat.&lt;br /&gt;
&lt;br /&gt;
Nota: Si la combinació número/director és invalida ha d'aparèixer un missatge d'error. Assegura't de controlar el cas en el que no hi ha director pel departament.&lt;br /&gt;
&lt;br /&gt;
c) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-47')&lt;br /&gt;
&lt;br /&gt;
d) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate(NULL)&lt;br /&gt;
&lt;br /&gt;
e) Prova el procediment CHK_HIREDATE mitjançant la comanda  següent:&lt;br /&gt;
&lt;br /&gt;
    SQL&amp;gt; execute chk_pack.chk_hiredate('01-ENE-98')&lt;br /&gt;
&lt;br /&gt;
==T15- Creació de triggers ==&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 1'''&lt;br /&gt;
&lt;br /&gt;
Les operacions DML sobre taules només es permetran en hores de feina, es a dir, entre les 8:45 del matí i las 5:50 de la tarda; de dilluns a divendres.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment emmagatzemat anomenat SECURE_DML que mostri un missatge d'error, en cas de no complir la regla anterior, com &amp;quot;Només es pot modificar dades en horari de feina&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
*'''Exercici 2'''&lt;br /&gt;
&lt;br /&gt;
Crea un trigger en la taula PRODUCT que cridi al procediment anterior.&lt;br /&gt;
&lt;br /&gt;
a) prova el procediment modificant la franja horària proposada anteriorment e intentant afegir un nou registre en la taula PRODUCT. Després de la comprovació restableix els valors originals.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 3'''&lt;br /&gt;
&lt;br /&gt;
La comissió d'un venedor canviaria amb qualsevol comanda nova o canvis en les comandes existents. La seva comissió s'emmagatzema en la columna COMM de la taula EMP. En la taula CUSTOMER s'assigna un venedor a un client particular.&lt;br /&gt;
&lt;br /&gt;
a) crea un procediment que actualitzarà la comissió del venedor. Utilitzaràs paràmetres per enviar l'identificador del client, el total antic de la comanda i el total nou de la comanda, des del trigger que es fa la crida. El procediment necessitarà localitzar el codi del empleat en la taula CUSTOMER i actualitzar el registre del venedor en la taula EMP, afegint una nova comissió al valor existent (percentatge de comissió el 5% del total de la comanda).&lt;br /&gt;
&lt;br /&gt;
b) Crea un trigger en la taula ORD que cridi al procediment, passant els paràmetres necessaris.&lt;br /&gt;
&lt;br /&gt;
c) Modifica la comanda 601 per assignar-li un total de 3$. Comprova que la comissión de WARD s'ha incrementat en 0.03. La comissió original era de 500.&lt;br /&gt;
&lt;br /&gt;
*'''Exercici 4'''&lt;br /&gt;
&lt;br /&gt;
A las taules EMP i DEPT se'ls aplica una sèrie de regles de negoci.&lt;br /&gt;
&lt;br /&gt;
Implementa les regles de negoci mitjançant triggers.&lt;br /&gt;
&lt;br /&gt;
Reglas de negocio:&lt;br /&gt;
&lt;br /&gt;
1. La taula EMP hauria de contenir exactament un PRESIDENT. Comproveu la resposta.&lt;br /&gt;
&lt;br /&gt;
2. Els salaris només podran augmentar-se, no disminuir-se.&lt;br /&gt;
&lt;br /&gt;
3. Si un departament es trasllada a una altra ubicació, cada empleat d'aquest departament tindrà automàticament un increment de salari del 2%.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
&lt;br /&gt;
'''Conceptes fonamentals'''&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T1 | Introducció PL/SQL]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T2 | Declaració de variables]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T3 | Escriptura de sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Interacció amb Oracle Server]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Estructures de control]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T6 | Tipus de dades compostes]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7 | Ús de cursors explícits]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T8 | Manegament d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T9 | Creació i us de procediments emmagatzemats]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;!----&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Solucions exercicis ==&lt;br /&gt;
BD SCOTT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T4 | Sentencies executables]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T5 | Interacció amb el servidor Oracle]]&lt;br /&gt;
 &lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T10 | Gestió d'excepcions]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T11 | Creació de procediments]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T12 | Creació de funcions]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T13 | Creació de paquets]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T15 | Creació de triggers]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_RA2:_Gesti%C3%B3_d%27usuaris&amp;diff=18736</id>
		<title>M2 - Bases de dades / Exercicis RA2: Gestió d'usuaris</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_RA2:_Gesti%C3%B3_d%27usuaris&amp;diff=18736"/>
				<updated>2025-01-10T15:32:39Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==MOLT IMPORTANT ABANS DE FER ELS EXERCICIS ORACLE 21.c alter session set &amp;quot;_ORACLE_SCRIPT&amp;quot;=true;==&lt;br /&gt;
&lt;br /&gt;
===Llenguatge de control de dades===&lt;br /&gt;
&lt;br /&gt;
'''Activitat 1: Creació d'usuaris'''&lt;br /&gt;
&lt;br /&gt;
1. Crea els usuaris user1, user2, i user3 amb contrasenyes password1, password2 i password3, respectivament.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 2: Creació de rols'''&lt;br /&gt;
&lt;br /&gt;
2. Crea els rols role_admin i role_readonly.&lt;br /&gt;
&lt;br /&gt;
3. Explica breument la diferència entre rols i privilegis d'objecte i com s'utilitzen en la seguretat de la base de dades.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 3: Assignació de Privilegis de Sistema'''&lt;br /&gt;
&lt;br /&gt;
4. Assigna el privilegi CREATE SESSION a user1, user2, i user3 per permetre'ls connectar-se a la base de dades.&lt;br /&gt;
&lt;br /&gt;
5. Assigna els privilegis CREATE TABLE, CREATE VIEW i CREATE SEQUENCE al rol role_admin.&lt;br /&gt;
&lt;br /&gt;
6. Assigna-li el rol role_admin al user1.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 4: Atorgar privilegis de sistema amb capacitat de propagació'''&lt;br /&gt;
&lt;br /&gt;
7. Atorga el privilegi CREATE SESSION a user2 amb l'opció de propagar-lo a altres usuaris.&lt;br /&gt;
&lt;br /&gt;
8. Inicia sessió com user2 i concedeix el privilegi CREATE SESSION a user3.&lt;br /&gt;
&lt;br /&gt;
9. Comprova els privilegis de sistema concedits a user3 utilitzant la vista DBA_SYS_PRIVS.&lt;br /&gt;
&lt;br /&gt;
10. Revoca el privilegi CREATE SESSION de user2 i observa què passa amb user3.&lt;br /&gt;
&lt;br /&gt;
11. Comprova si user3 encara té el privilegi CREATE SESSION.&lt;br /&gt;
&lt;br /&gt;
12. Explica per què user3 perd el privilegi CREATE SESSION quan aquest es revoca de user2.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 5: Assignació de privilegis d'objecte'''&lt;br /&gt;
&lt;br /&gt;
13. Crea una taula employee a l'esquema de user1 i concedeix el privilegi SELECT a user2 i user3 (Connecta't com a user1 i crea la taula, desprès connecta't com system i concedeix el privilegi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE employee (&lt;br /&gt;
    emp_id NUMBER PRIMARY KEY,&lt;br /&gt;
    emp_name VARCHAR2(50),&lt;br /&gt;
    address VARCHAR2(25),&lt;br /&gt;
    salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
14. Assigna el privilegi INSERT a la taula employee al rol role_admin i concedeix aquest rol a user3.&lt;br /&gt;
&lt;br /&gt;
15. Atorga a user2 el privilegi SELECT només sobre la columna salary de la taula employee.&lt;br /&gt;
&lt;br /&gt;
16. Atorga a user3 el privilegi UPDATE només sobre la columna address de la taula employee.&lt;br /&gt;
&lt;br /&gt;
17. Comprova els privilegis concedits sobre la taula employee, incloent columnes específiques, utilitzant la vista DBA_TAB_PRIVS.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 6: Atorgar el privilegi de donar un privilegi'''&lt;br /&gt;
&lt;br /&gt;
18. Atorga a user2 el privilegi SELECT sobre la taula employee amb l’opció de concedir aquest privilegi a altres usuaris.&lt;br /&gt;
&lt;br /&gt;
19. Inicia sessió com user2 i concedeix el privilegi SELECT sobre la taula employee a user3.&lt;br /&gt;
&lt;br /&gt;
20. Comprova els privilegis de user3 sobre la taula employee utilitzant el diccionari de dades.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 7: Revocació d'un privilegi amb efectes propagats'''&lt;br /&gt;
&lt;br /&gt;
21. Revoca el privilegi SELECT de user2 sobre la taula employee i observa què passa amb user3.&lt;br /&gt;
&lt;br /&gt;
22. Comprova si user3 encara pot accedir a la taula employee.&lt;br /&gt;
&lt;br /&gt;
23. Explica per què user3 perd el privilegi SELECT quan aquest es revoca de user2.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 8: Assignació de privilegis a rols i usuaris'''&lt;br /&gt;
&lt;br /&gt;
24. Concedeix el rol role_readonly a user2 i assigna-li els privilegis SELECT i UPDATE en la taula employee.&lt;br /&gt;
&lt;br /&gt;
25. Crea una vista view_employee_salary per user1 que mostri només l’emp_id i salary de la taula employee. Concedeix el privilegi SELECT en aquesta vista a user3.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 9: Modificació d'usuaris i rols'''&lt;br /&gt;
&lt;br /&gt;
26. Canvia la contrasenya de user1 a newpassword1 i afegeix el privilegi DROP TABLE al rol role_admin.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 10: Revocació de privilegis a usuaris i rols'''&lt;br /&gt;
&lt;br /&gt;
27. Revoca el privilegi UPDATE de la taula employee del rol role_readonly.&lt;br /&gt;
&lt;br /&gt;
28. Revoca el rol role_admin de user3.&lt;br /&gt;
&lt;br /&gt;
Activitat 11: Consultes sobre privilegis al diccionari de dades&lt;br /&gt;
&lt;br /&gt;
29. Consulta el diccionari de dades per llistar tots els privilegis de sistema assignats a user2.&lt;br /&gt;
&lt;br /&gt;
30. Llista tots els privilegis d'objecte assignats al rol role_admin.&lt;br /&gt;
&lt;br /&gt;
31. Llista tots els usuaris i rols que tenen el privilegi SELECT sobre la taula employee.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 12: Bloqueig i desbloqueig d'usuaris'''&lt;br /&gt;
&lt;br /&gt;
32. Bloqueja l'usuari user1 per evitar que es pugui connectar a la base de dades.&lt;br /&gt;
&lt;br /&gt;
33. Comprova l’estat de l’usuari user1 utilitzant la vista DBA_USERS.&lt;br /&gt;
&lt;br /&gt;
34. Desbloqueja l'usuari user1 per permetre-li connectar-se novament.&lt;br /&gt;
&lt;br /&gt;
35. Fes una consulta que llisti tots els usuaris bloquejats en la base de dades.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 13: Eliminació d'usuaris i rols'''&lt;br /&gt;
&lt;br /&gt;
36. Elimina el rol role_readonly i els usuaris user2 i user3.&lt;br /&gt;
&lt;br /&gt;
37. Elimina la taula employee i la vista view_employee_salary de l'esquema user1 (connecta't com user1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Administració Oracle==&lt;br /&gt;
&lt;br /&gt;
1.Crear un tablespace de nombre compras asociándole un fichero en disco llamado ‘COMPRAS.ORA’ de 5 Mb.&lt;br /&gt;
&lt;br /&gt;
2.Modificar el tablespace anterior para que pueda autoextenderse automáticamente, sin límite de espacio en disco.&lt;br /&gt;
&lt;br /&gt;
3. Crear el usuario RH. Tablespace por defecto: users, Tablespace temporal: Temp. Asignar al usuario RH los roles CONNECT i RESOURCE.&lt;br /&gt;
&lt;br /&gt;
4. Crear las tablas como RH. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE CLIENTE (&lt;br /&gt;
DNI VARCHAR2(10),&lt;br /&gt;
NOMBRE VARCHAR2(20),&lt;br /&gt;
FECHA_NAC DATE NOT NULL,&lt;br /&gt;
DIRECCION VARCHAR2(200),&lt;br /&gt;
TFNO VARCHAR2(10),&lt;br /&gt;
APELLIDOS VARCHAR2(100),&lt;br /&gt;
CONSTRAINT CLIENTE_PK PRIMARY KEY (DNI));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE PROVEEDOR(&lt;br /&gt;
NIF VARCHAR2(10),&lt;br /&gt;
NOMBRE VARCHAR2(20),&lt;br /&gt;
DIRECCION VARCHAR2(200),&lt;br /&gt;
TFNO VARCHAR2(10),&lt;br /&gt;
CONSTRAINT PROVEEDOR_PK PRIMARY KEY (NIF));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5.Amb l'usuari SYSTEM, crear un rol que tenga los siguientes privilegios: INSERT y  SELECT  en las tablas RH.CLIENTE y RH.PROVEEDOR, CREATE SESSION, CREATE DATABASE LINK, CREATE TABLE y  CREATE VIEW.&lt;br /&gt;
&lt;br /&gt;
6.Crear un usuario llamado COMPRADOR. El tablespace por defecto es COMPRAS. Se le asigna  1Mb en el tablespace COMPRAS y 0 de cuota en el tablespace SYSTEM. El tablespace temporal será TEMP. Asignarle el rol anterior. &lt;br /&gt;
&lt;br /&gt;
7.Crear un usuario de base de datos llamado ‘administrador’ que tenga funciones de administrador, ponedle de pasword administrador &lt;br /&gt;
&lt;br /&gt;
8.Conectarse con el nombre de usuario creado anteriormente. &lt;br /&gt;
&lt;br /&gt;
9.Crear varias tablas  como administrador. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE CLIENTE (&lt;br /&gt;
DNI VARCHAR2(10),&lt;br /&gt;
NOMBRE VARCHAR2(20),&lt;br /&gt;
FECHA_NAC DATE NOT NULL,&lt;br /&gt;
DIRECCION VARCHAR2(200),&lt;br /&gt;
TFNO VARCHAR2(10),&lt;br /&gt;
APELLIDOS VARCHAR2(100),&lt;br /&gt;
CONSTRAINT CLIENTE_PK PRIMARY KEY (DNI));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE PROVEEDOR(&lt;br /&gt;
NIF VARCHAR2(10),&lt;br /&gt;
NOMBRE VARCHAR2(20),&lt;br /&gt;
DIRECCION VARCHAR2(200),&lt;br /&gt;
TFNO VARCHAR2(10),&lt;br /&gt;
CONSTRAINT PROVEEDOR_PK PRIMARY KEY (NIF));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
CREATE TABLE PRODUCTO(&lt;br /&gt;
NOMBRE VARCHAR2(50),&lt;br /&gt;
CODIGO VARCHAR2(50),&lt;br /&gt;
PRECIO NUMBER(10) NOT NULL,&lt;br /&gt;
PRV_NIF VARCHAR2(10),&lt;br /&gt;
CONSTRAINT PRODUCTO_PK PRIMARY KEY (CODIGO),&lt;br /&gt;
CONSTRAINT PROVEEDOR_FK FOREIGN KEY(PRV_NIF) REFERENCES PROVEEDOR (NIF));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE CLIENTE_PRODUCTO(&lt;br /&gt;
PRD_CODIGO VARCHAR2(50),&lt;br /&gt;
CLN_DNI VARCHAR2(10),&lt;br /&gt;
CONSTRAINT CLIENTE_PRODUCTO_PK PRIMARY KEY (PRD_CODIGO, CLN_DNI),&lt;br /&gt;
CONSTRAINT PRODUCTOCP_FK FOREIGN KEY (PRD_CODIGO) REFERENCES PRODUCTO(CODIGO),&lt;br /&gt;
CONSTRAINT CLIENTECP_FK FOREIGN KEY (CLN_DNI) REFERENCES CLIENTE(DNI));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10.Crear 5 usuarios nuevos ( USU1, USU2, USU3, USU4, USU5) con la misma contraseña que el nombre, asignándoles el tablespace COMPRAS y una cuota de 2M &lt;br /&gt;
&lt;br /&gt;
11.Dar permiso a USU1 sólo para que pueda conectarse a la BD.&lt;br /&gt;
&lt;br /&gt;
12.Crear un rol que permita conectarse a la BD y hacer SELECT sobre las tablas definidas en el ejercicio 9. &lt;br /&gt;
&lt;br /&gt;
13.Asignar el rol creado a los usuarios USU2 y USU3. &lt;br /&gt;
&lt;br /&gt;
14.Conceder al usuario USU4 privilegios INSERT y DELETE sobre las tablas CLIENTE y PROVEEDOR con la opción de poder concedérselos a otros usuarios. &lt;br /&gt;
&lt;br /&gt;
15.Conceder al usuario USU5 cuatro privilegios de sistema, dos de ellos con la opción de poder concedérselos a otros usuarios. &lt;br /&gt;
&lt;br /&gt;
16. Conceder a todos los usuarios de la BD privilegios para que puedan modificar las columnas  DIRECCION y TFNO de las tablas CLIENTE y PROVEEDOR. &lt;br /&gt;
&lt;br /&gt;
17.Quitar a los usuarios USU3 y USU4 todos los privilegios que tenían asignados. &lt;br /&gt;
&lt;br /&gt;
18. Comprovar la limitació de recursos. En cas de que no estigui activa, activar-la.&lt;br /&gt;
&lt;br /&gt;
19.Hacer que USU5 sólo pueda conectarse en dos sesiones concurrentes a la vez. &lt;br /&gt;
&lt;br /&gt;
20.Limitar el tiempo de conexión a la BD a 5 minutos a los usuarios USU2 y USU3.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions Administració Oracle | Solucions Administració Oracle]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Accés a la base de dades==&lt;br /&gt;
&lt;br /&gt;
1.Crear un usuario 'USER1' con autentificación de contraseña ('insti'). Otorgale el privilegio de iniciar sesión.&lt;br /&gt;
&lt;br /&gt;
2.Entrar como 'USER1' y cambiar la contraseña a 'merce'.&lt;br /&gt;
&lt;br /&gt;
3.Crea el tablespace de nombre usuarios asociándole un fichero en disco llamado 'USUARIOS.ORA' de 5 Mb.&lt;br /&gt;
Asignar el tablespace usuarios y como temporal el tablespace temp a 'USER1'.&lt;br /&gt;
&lt;br /&gt;
4.Bloqueamos la cuenta de 'USER1'.&lt;br /&gt;
&lt;br /&gt;
5.Desbloqueamos la cuenta de 'USER1'.&lt;br /&gt;
&lt;br /&gt;
6.Conceder privilegios a 'USER1' para que pueda conectarse, crear tablas, vistas, secuencias y tipos. Permitirle que pueda conceder estos privilegios a otros usuarios.&lt;br /&gt;
&lt;br /&gt;
7.Revocar los privilegios concedidos a 'USER1'.&lt;br /&gt;
&lt;br /&gt;
8.Conceder los privilegios INSERT, UPDATE, DELETE y SELECT para la tabla ‘cliente’ (RH.cliente) a 'USER1'.&lt;br /&gt;
&lt;br /&gt;
9.Conceder todos los privilegios para la tabla ‘dept’ a 'USER1' incluyendo que pueda conceder estos privilegios a otros usuarios.&lt;br /&gt;
&lt;br /&gt;
10.Queremos que un usuario llamado 'USER2' (crearlo), con contraseña 'merce', sólo pueda hacer INSERT en las columnas (DNI, nombre), UPDATE en las columnas (direccion, telefono) y REFERENCES en la columna (DNI) y SELECT en todas las columnas de la tabla 'cliente' de 'RH'.&lt;br /&gt;
&lt;br /&gt;
11.Revocar el privilegio references a 'USER2'.&lt;br /&gt;
&lt;br /&gt;
12.Crear un rol para los programadores de aplicaciones del sistema llamado 'PAS' con contraseña ‘sistema’.&lt;br /&gt;
&lt;br /&gt;
13.Conceder los privilegios  de sistema CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX, CREATE SÉQUENCE, CREATE TYPE al rol 'PAS' creado anteriormente.&lt;br /&gt;
&lt;br /&gt;
14.Conceder los privilegios  de objeto INSERT, UPDATE, DELETE, SELECT sobre la tabla 'cliente' al rol 'PAS'.&lt;br /&gt;
&lt;br /&gt;
15.Conceder el rol 'PAS' al usuario 'USER2'.&lt;br /&gt;
&lt;br /&gt;
16.Conceder el rol PAS'al usuario 'USER1'.&lt;br /&gt;
&lt;br /&gt;
17.Conceder al usuario 'USER2' el derecho de 5mb de espacio en el espacio de tabla USERS.&lt;br /&gt;
&lt;br /&gt;
18.Conceder al usuario 'USER2' el derecho de cantidad ilimitada  de espacio en el espacio de tabla USERS.&lt;br /&gt;
&lt;br /&gt;
19.Conceder al usuario 'USER1'  cuota ilimitada a todos los espacios de tablas.&lt;br /&gt;
&lt;br /&gt;
ACTIVACIÓ DE PERFILS:&lt;br /&gt;
&lt;br /&gt;
ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;&lt;br /&gt;
&lt;br /&gt;
20.Crear un perfil 'LIMREC con los límites de recursos siguientes: máximo de 5 sesiones de BD concurrentes abiertas, CPU por sesión ilimitada, CPU por petición de BD 30 segundos, tiempo de conexión activa ilimitado,  estar inactivo durante un tiempo máximo de 30 minutos, lecturas lógicas por sesión ilimitadas y lecturas lógicas por petición 1000. &lt;br /&gt;
&lt;br /&gt;
21.Modificar el perfil anterior ajustando la contraseña de administración a: bloquear la cuenta tras tres intentos consecutivos sin éxito, si se bloquea la cuenta mantener esta bloqueada durante todo un día, tiempo de vida para la contraseña de 30 días más un periodo de grácia de cinco días, el perfil de usuario no puede volver a usar una contraseña antigua.&lt;br /&gt;
&lt;br /&gt;
22.Hacer que caduque la contraseña de 'USER2'. &lt;br /&gt;
&lt;br /&gt;
23.Asignar a USER1 el perfil 'LIMREC'. &lt;br /&gt;
&lt;br /&gt;
24.Deshabilitar la administración de contraseñas para el perfil predeterminado de la BD.&lt;br /&gt;
&lt;br /&gt;
25. Mostrar información (status del compte, tablespace per defecte i tablespace temporal i perfil) acerca de los usuarios 'USER1' y 'USER2'. Vista DBA_USERS.  &lt;br /&gt;
&lt;br /&gt;
26.Mostrar información sobre los roles de la base de datos. &lt;br /&gt;
&lt;br /&gt;
27.Mostrar información acerca de las cuotas de espacio de tablas. &lt;br /&gt;
&lt;br /&gt;
28.Mostrar información acerca del perfil ‘LIMREC’.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Accés a la base de dades | Solucions Accés a la base de dades]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Gestió d'usuaris==&lt;br /&gt;
&lt;br /&gt;
1. Buscar en la bd el contenido de las vistas: dba_profiles ; dba_roles; dba_users; dba_role_privs ; dba_tab_privs ; dba_sys_privs. (antes de hacer select * sobre estas vistas consultar con un  describe o desc las columnas que nos interesan)&lt;br /&gt;
&lt;br /&gt;
2. Crear un usuario llamado “administrador” autentificado por la base de datos. Indicar como &amp;quot;tablespace&amp;quot; por defecto USERS y como &amp;quot;tablespace&amp;quot; temporal TEMP; asignar una cuota de 500K en el &amp;quot;tablespace&amp;quot; USERS. &lt;br /&gt;
&lt;br /&gt;
3. Abrir una sesión sqlplus e intentar conectaros como usuario “administrador”, ¿qué sucede?, ¿por qué?. &lt;br /&gt;
&lt;br /&gt;
4. Averiguar qué privilegios de sistema, roles y privilegios sobre objetos tiene concedidos el usuario “administrador”. &lt;br /&gt;
&lt;br /&gt;
5. Otorgar el privilegio “CREATE SESSION” al usuario “administrador” e intentar de nuevo la conexión sqlplus. &lt;br /&gt;
&lt;br /&gt;
6. Conectarse como usuario “administrador” y crear un usuario llamado “prueba00” que tenga como &amp;quot;tablespace&amp;quot; por defecto USERS y como &amp;quot;tablespace&amp;quot; temporal TEMP; asignar una cuota de 0K en el &amp;quot;tablespace&amp;quot; USERS. ¿Es posible hacerlo?. &lt;br /&gt;
&lt;br /&gt;
7.  Conectado como usuario SYSTEM, otorgar el privilegio “create user” al usuario “administrador” y repetir el ejercicio anterior. &lt;br /&gt;
&lt;br /&gt;
8. Averiguar que usuarios de la base de datos tienen asignado el privilegio “create user” de forma directa, ¿qué vista debe ser consultada?. &lt;br /&gt;
&lt;br /&gt;
9. Hacer lo mismo para el privilegio “create session”. &lt;br /&gt;
&lt;br /&gt;
10. Crear dos &amp;quot;tablespace&amp;quot; llamados NOMINA y ACADEMO, que contendrán datos relativos a las aplicaciones de nomina y datos académicos de los empleados de una empresa, según las siguientes características:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_10.png |600px|center| tablespace]]&lt;br /&gt;
&lt;br /&gt;
11. Crear dos &amp;quot;tablespace&amp;quot; temporales, manejados de forma local, llamados TEMP_NOMINA y TEMP_ACADEMO con las siguientes características: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_11.png |500px|center| tablespace]]&lt;br /&gt;
&lt;br /&gt;
12. Estando conectado como usuario “administrador” probar a crear un rol llamado “administrador”, ¿qué ocurre?. &lt;br /&gt;
&lt;br /&gt;
13. Idem estando conectado como usuario SYSTEM, ¿qué sucede?, ¿por qué?. &lt;br /&gt;
&lt;br /&gt;
14. Comprobar en el diccionario de datos los usuarios o roles que poseen el privilegio “CREATE ROLE”. &lt;br /&gt;
&lt;br /&gt;
15. Crear un rol llamado “ADMIN”, asignarle los privilegios “create session”, “cr eate user” y “CREATE ROLE”. Asignarlo al usuario administrador. &lt;br /&gt;
&lt;br /&gt;
16. Consultar los privilegios de sistema que tiene asignados de forma directa el usuario “administrador”, revocarlos y asignarle el rol “admin.”. &lt;br /&gt;
&lt;br /&gt;
17. Crear, conectado como SYSTEM, un usuario llamado “prueba01” autenticado por base de datos al que no se le asigne &amp;quot;tablespace&amp;quot; por defecto ni temporal. &lt;br /&gt;
&lt;br /&gt;
18. Consultar en las vistas correspondientes los &amp;quot;tablespaces&amp;quot; y la quota en cada uno de ellos que tiene los usuarios SYS, SYSTEM, “administrador”, “prueba00” y “prueba01”. ¿Qué ha ocurrido con el usuario “prueba01”?. &lt;br /&gt;
&lt;br /&gt;
19. Crear un usuario llamado “prueba02” autenticado por base de datos, asignando como &amp;quot;tablespace&amp;quot; por defecto NOMINA y como &amp;quot;tablespace&amp;quot; temporal TEMP_NOMINA (no se le asignara cuota en NOMINA). &lt;br /&gt;
&lt;br /&gt;
20.  Asignar al usuario “prueba01” los &amp;quot;tablespace&amp;quot; ACADEMO y TEMP_ACADEMO como &amp;quot;tablespace&amp;quot; de trabajo y temporal respectivamente (sin especificar cuota). &lt;br /&gt;
&lt;br /&gt;
21. Consultar en las vistas correspondientes los &amp;quot;tablespace&amp;quot; y la cuota en cada uno de ellos que tiene los usuarios “prueba01” y “prueba02”. &lt;br /&gt;
&lt;br /&gt;
22. Crear un rol llamado “CONEXIÓN” y asignarle el permiso “CREATE SESSION”. &lt;br /&gt;
&lt;br /&gt;
23. Asignar el rol “CONEXIÓN” a los usuarios “prueba00”, “prueba01” y “prueba02” &lt;br /&gt;
&lt;br /&gt;
24. Comprobar en la vista correspondiente cuales son los roles asignados a los usuarios “prueba00”, “prueba01” y “prueba02”. &lt;br /&gt;
&lt;br /&gt;
25. Conectarse como usuario “prueba01” y crear la tabla siguiente en el &amp;quot;tablespace&amp;quot;  ACADEMO: &lt;br /&gt;
&lt;br /&gt;
:::CREATE TABLE CODIGOS &lt;br /&gt;
:::(CODIGO varchar2(3), &lt;br /&gt;
:::DESCRIPCION varchar2(20)) &lt;br /&gt;
:::TABLESPACE ACADEMO &lt;br /&gt;
:::STORAGE (INITIAL 64K &lt;br /&gt;
:::NEXT 64K &lt;br /&gt;
:::MINEXTENTS 5 &lt;br /&gt;
:::MAXEXTENTS 10); &lt;br /&gt;
&lt;br /&gt;
¿Es posible hacerlo?, ¿falta algún permiso?. &lt;br /&gt;
&lt;br /&gt;
26. Crear un rol llamado “DESARROLLO” y asignarle los permisos &amp;quot;CREATE SEQUENCE&amp;quot;, &amp;quot;CREATE SESSION&amp;quot;, &amp;quot;CREATE SYNONYM&amp;quot;, &amp;quot;CREATE TABLE&amp;quot; y &amp;quot;CREATE VIEW&amp;quot;. Asignar el rol “DESARROLLO” a los usuarios “prueba00”, “prueba01” y “prueba02”. &lt;br /&gt;
&lt;br /&gt;
27. Volver a conectarse como usuario “prueba01” y crear la tabla anterior en el &amp;quot;tablespace&amp;quot; ACADEMO. &lt;br /&gt;
&lt;br /&gt;
28. Asignar cuota ilimitada al usuario “prueba01” en el &amp;quot;tablespace&amp;quot; ACADEMO. Volver a repetir el ejercicio 27.&lt;br /&gt;
&lt;br /&gt;
29. Asignar cuota ilimitada al usuario “prueba02” en el &amp;quot;tablespace&amp;quot; NOMINA.&lt;br /&gt;
 &lt;br /&gt;
30. Obtener información sobre roles, privilegios de sistema, &amp;quot;tablespace&amp;quot; y cuotas para los usuarios “prueba00”, “prueba01” y “prueba02”. &lt;br /&gt;
&lt;br /&gt;
31. Asignar cuota cero en el &amp;quot;tablespace&amp;quot; por defecto para el usuario “prueba01”, ¿siguen estando sus objetos?, ¿es posible crear algún otro? (probad a crear un tabla). &lt;br /&gt;
&lt;br /&gt;
32. Conectarse como usuario “prueba01” e intentar modificar su cuota en el &amp;quot;tablespace&amp;quot; ACADEMO, ¿es posible?. &lt;br /&gt;
&lt;br /&gt;
33. Conectarse como usuario “prueba01” y modificar su clave, ¿es posible?. &lt;br /&gt;
&lt;br /&gt;
34. Averiguar que usuarios o roles de base de datos tienen asignado el privilegio ALTER USER. &lt;br /&gt;
&lt;br /&gt;
35. Abrir una sesión con el usuario “administrador” y otra con el usuario “prueba02”. Siendo el usuario “administrador”, intentar borrar el usuario “prueba02”. &lt;br /&gt;
&lt;br /&gt;
36. .Asignar el permiso DROP USER al rol ADMIN. &lt;br /&gt;
&lt;br /&gt;
37. Averiguar que usuarios o roles de base de datos tienen asignado el privilegio DROP USER. &lt;br /&gt;
&lt;br /&gt;
38. Conectado como usuario &amp;quot;administrador&amp;quot;, crear el usuario “prueba03” autentificado por base de datos y asignando cuotas en el &amp;quot;tablespace&amp;quot; ACADEMO (500K) y NOMINA (200K). Su &amp;quot;tablespace&amp;quot; por defecto serà ACADEMO i su tablespace temporal será TEMP. &lt;br /&gt;
&lt;br /&gt;
39. Comprobar en el fichero de inicialización si está activado el modo de limitación de recursos. &lt;br /&gt;
&lt;br /&gt;
40. Averiguar que usuarios de base de datos o que roles tienen asignado el privilegio “CREATE PROFILE”. &lt;br /&gt;
&lt;br /&gt;
41. Asignar el permiso “CREATE PROFILE” al rol ADMIN. &lt;br /&gt;
&lt;br /&gt;
42. Averiguar que perfiles están definidos en la base de datos y que límites de recursos fija cada uno de ellos. &lt;br /&gt;
&lt;br /&gt;
43. Consultar que perfiles tiene asignados cada usuario de la base de datos. &lt;br /&gt;
&lt;br /&gt;
44. Crear un perfil llamado “DESARROLLO” con las siguientes especificaciones:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_44.png |500px|center| perfil]]&lt;br /&gt;
&lt;br /&gt;
45. Asignar el perfil anterior a los usuarios “prueba00”, “prueba01”, “prueba02” y “prueba03”. &lt;br /&gt;
&lt;br /&gt;
46. Intentar la conexión dos veces como usuario “prueba01” fallando la contraseña, ¿qué sucede?. Comprobar si la cuenta ha sido bloqueada en la vista de base de datos correspondiente .&lt;br /&gt;
&lt;br /&gt;
47. Crear un usuario “prueba04” con el parámetro “password expire”, sus &amp;quot;tablespace&amp;quot; por defecto y temporal serán USERS (cuota 0k) y TEMP. Asignar los roles CONEXIÓN y DESARROLLO. Conectarse como usuario “prueba04”, ¿qué sucede?. &lt;br /&gt;
&lt;br /&gt;
48. Bloquear la cuenta del usuario “prueba04”, ¿qué sucede al conectarse de nuevo?. &lt;br /&gt;
&lt;br /&gt;
49. .Modificar el &amp;quot;tablespace&amp;quot; por defecto y el temporal del usuario “prueba01” de forma que sean NOMINA y TEMP_NOMINA. &lt;br /&gt;
&lt;br /&gt;
50. Comprobar cual es el valor del parámetro OS_AUTHENT_PREFIX en la base de datos. (en init&amp;lt;SID&amp;gt;.ora)&lt;br /&gt;
&lt;br /&gt;
51. Cambia la identificación del usuario “prueba01” de forma que sea identificado por el sistema operativo. &lt;br /&gt;
&lt;br /&gt;
52. Modificar el parámetro OS_AUTHENT_PREFIX de forma que, en adelante, la cadena que identifique a un usuario externo sea “” (cadena vacía). (en el  fichero de parámetros de inicializacion (init&amp;lt;SID&amp;gt;.ora). Indicar: os_authent_prefix = &amp;quot;&amp;quot; &lt;br /&gt;
&lt;br /&gt;
53. Desbloquear la cuenta del usuario “prueba04”. &lt;br /&gt;
&lt;br /&gt;
54. Modificar los valores del perfil DEFAULT según se indica en la siguiente tabla:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_54.png |500px|center| perfil]]&lt;br /&gt;
&lt;br /&gt;
55. Averiguar que usuarios o roles tienen asignado el privilegio “ALTER PROFILE”.&lt;br /&gt;
 &lt;br /&gt;
56. Asignar el privilegio anterior al rol ADMIN. &lt;br /&gt;
&lt;br /&gt;
57. Comprobar los valores asignados al perfil “DESARROLLO”. Modificar el perfil “DESARROLLO”, desde el usuario “administrador”, según la siguiente tabla: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_57.png |500px|center| perfil]]&lt;br /&gt;
&lt;br /&gt;
¿Qué ha sucedido con el resto de los parámetros?. ¿Coincide el valor de “Connect_time” en este perfil con el que tiene en el perfil DEFAULT?. &lt;br /&gt;
&lt;br /&gt;
58. Averiguar los privilegios de sistema y sobre objetos, así como los roles, que tiene asignados los roles por defecto “CONNECT”, “RESOURCE”, “DBA”, “EXP_FULL_DATABASE” e “IMP_FULL_DATABASE”. ¿Consideras una buena política de seguridad asignar el rol “CONNECT” a todos los usuarios que precisan conectarse a la base de datos?. &lt;br /&gt;
&lt;br /&gt;
59. ¿Puede asignarse el perfil “DESARROLLO” al rol “CONNECT”?. ¿Y el perfil “DEFAULT” al perfil “DESARROLLO”? &lt;br /&gt;
&lt;br /&gt;
60. Averiguar que usuarios o roles de la base de datos tienen asignado el privilegio “DROP PROFILE”. &lt;br /&gt;
&lt;br /&gt;
61. Asignar el privilegio “DROP PROFILE” al rol “ADMIN.”. &lt;br /&gt;
&lt;br /&gt;
62. Conectarse como usuario “administrador” e intentar eliminar el perfil “DEFAULT”, ¿qué ocurre?. &lt;br /&gt;
&lt;br /&gt;
63. Como usuario “administrador” crear el rol “SECRETO” identificado por la contraseña “total” y asignarlo al usuario “prueba04”. &lt;br /&gt;
&lt;br /&gt;
64. Averiguar que usuarios poseen el privilegio “ALTER ANY ROLE” (de forma directa o a través de roles). &lt;br /&gt;
&lt;br /&gt;
65. ¿Qué valor tiene en la base de datos el parámetro MAX_ENABLED_ROLES?. Modificar su valor para que, en adelante, valga 40. Comprobar esta modificación. &lt;br /&gt;
&lt;br /&gt;
66. Averiguar que usuarios poseen el privilegio “GRANT ANY ROLE” (de forma directa o a través de roles). &lt;br /&gt;
&lt;br /&gt;
67. Como usuario “administrador”, deasignar el rol “SECRETO” al usuario “prueba04”. &lt;br /&gt;
&lt;br /&gt;
68. Asignar el privilegio “GRANT ANY ROLE” al rol “ADMIN.”. &lt;br /&gt;
&lt;br /&gt;
69. Averiguar de nuevo que usuarios poseen el privilegio “GRANT ANY ROLE” (de forma directa o a través de roles). &lt;br /&gt;
&lt;br /&gt;
70. Averiguar que usuarios poseen el privilegio “DROP ANY ROLE” (de forma directa o a través de roles). &lt;br /&gt;
&lt;br /&gt;
71. Asignar permiso de conexión al usuario &amp;quot;prueba03&amp;quot;, asignar el rol “SECRETO” al mismo usuario. Conectarse como este usuario e intentar borrar el rol. &lt;br /&gt;
&lt;br /&gt;
72. En caso de que no lo tenga asignado, asignar el rol “CONEXION” y el rol “DESARROLLO” al usuario “prueba04”. Hacer que solo el rol “CONEXIÓN” este activo &lt;br /&gt;
cuando se conecte. &lt;br /&gt;
&lt;br /&gt;
73. Comprobar en la vista apropiada del diccionario de datos los roles activos en la sesión. &lt;br /&gt;
&lt;br /&gt;
74. Conectado como usuario “prueba04”, activar el rol “DESARROLLO” y comprobar de nuevo en la vista apropiada del diccionario de datos los roles activos en la sesión. &lt;br /&gt;
&lt;br /&gt;
75. Asignar el rol &amp;quot;CONNECT&amp;quot; al usuario &amp;quot;ADMIN&amp;quot;. ¿Es preciso asignarle los permisos &amp;quot;CREATE PROCEDURE&amp;quot;, &amp;quot;CREATE PUBLIC SYNONYM&amp;quot;, &amp;quot;CREATE ROLE&amp;quot;, &amp;quot;CREATE TRIGGER&amp;quot;?, ¿Los tiene ya asignados?. &lt;br /&gt;
&lt;br /&gt;
76. Conectarse como usuario SYSTEM y otorgar al usuario &amp;quot;prueba02&amp;quot; el permiso para seleccionar datos de la tabla códigos (pertenece al usuario &amp;quot;prueba01&amp;quot;). ¿Qué sucede?, ¿por qué?. &lt;br /&gt;
&lt;br /&gt;
77. Conectarse como usuario &amp;quot;prueba01&amp;quot; y otorgar al usuario &amp;quot;prueba02&amp;quot; el permiso para seleccionar datos de la tabla códigos; hacerlo de forma que &amp;quot;prueba02&amp;quot; también pueda otorgar el permiso a otros usuarios (opción ADMIN). &lt;br /&gt;
&lt;br /&gt;
78. Conectarse como usuario &amp;quot;prueba02&amp;quot; y otorgar al usuario &amp;quot;prueba03&amp;quot; el permiso para seleccionar datos de la tabla códigos. &lt;br /&gt;
&lt;br /&gt;
79. Conectarse como usuario &amp;quot;prueba01&amp;quot; y revocar al usuario &amp;quot;prueba02&amp;quot; el permiso para seleccionar datos de la tabla códigos. &lt;br /&gt;
&lt;br /&gt;
80. Conectarse como usuario &amp;quot;prueba03&amp;quot; e intentar consultar la tabla códigos. ¿Qué ocurre?, ¿por qué?.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions Gestió d'usuaris | Solucions Gestió d'usuaris]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_RA2:_Gesti%C3%B3_d%27usuaris&amp;diff=18735</id>
		<title>M2 - Bases de dades / Exercicis RA2: Gestió d'usuaris</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_RA2:_Gesti%C3%B3_d%27usuaris&amp;diff=18735"/>
				<updated>2025-01-10T15:31:51Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==MOLT IMPORTANT ABANS DE FER ELS EXERCICIS ORACLE 21.c alter session set &amp;quot;_ORACLE_SCRIPT&amp;quot;=true;==&lt;br /&gt;
&lt;br /&gt;
===Llenguatge de control de dades===&lt;br /&gt;
&lt;br /&gt;
'''Activitat 1: Creació d'usuaris'''&lt;br /&gt;
&lt;br /&gt;
1. Crea els usuaris user1, user2, i user3 amb contrasenyes password1, password2 i password3, respectivament.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 2: Creació de rols'''&lt;br /&gt;
&lt;br /&gt;
2. Crea els rols role_admin i role_readonly.&lt;br /&gt;
&lt;br /&gt;
3. Explica breument la diferència entre rols i privilegis d'objecte i com s'utilitzen en la seguretat de la base de dades.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 3: Assignació de Privilegis de Sistema'''&lt;br /&gt;
&lt;br /&gt;
4. Assigna el privilegi CREATE SESSION a user1, user2, i user3 per permetre'ls connectar-se a la base de dades.&lt;br /&gt;
&lt;br /&gt;
5. Assigna els privilegis CREATE TABLE, CREATE VIEW i CREATE SEQUENCE al rol role_admin.&lt;br /&gt;
&lt;br /&gt;
6. Assigna-li el rol rol_admin al user1;&lt;br /&gt;
&lt;br /&gt;
'''Activitat 4: Atorgar privilegis de sistema amb capacitat de propagació'''&lt;br /&gt;
&lt;br /&gt;
7. Atorga el privilegi CREATE SESSION a user2 amb l'opció de propagar-lo a altres usuaris.&lt;br /&gt;
&lt;br /&gt;
8. Inicia sessió com user2 i concedeix el privilegi CREATE SESSION a user3.&lt;br /&gt;
&lt;br /&gt;
9. Comprova els privilegis de sistema concedits a user3 utilitzant la vista DBA_SYS_PRIVS.&lt;br /&gt;
&lt;br /&gt;
10. Revoca el privilegi CREATE SESSION de user2 i observa què passa amb user3.&lt;br /&gt;
&lt;br /&gt;
11. Comprova si user3 encara té el privilegi CREATE SESSION.&lt;br /&gt;
&lt;br /&gt;
12. Explica per què user3 perd el privilegi CREATE SESSION quan aquest es revoca de user2.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 5: Assignació de privilegis d'objecte'''&lt;br /&gt;
&lt;br /&gt;
13. Crea una taula employee a l'esquema de user1 i concedeix el privilegi SELECT a user2 i user3 (Connecta't com a user1 i crea la taula, desprès connecta't com system i concedeix el privilegi).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE employee (&lt;br /&gt;
    emp_id NUMBER PRIMARY KEY,&lt;br /&gt;
    emp_name VARCHAR2(50),&lt;br /&gt;
    address VARCHAR2(25),&lt;br /&gt;
    salary NUMBER);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
14. Assigna el privilegi INSERT a la taula employee al rol role_admin i concedeix aquest rol a user3.&lt;br /&gt;
&lt;br /&gt;
15. Atorga a user2 el privilegi SELECT només sobre la columna salary de la taula employee.&lt;br /&gt;
&lt;br /&gt;
16. Atorga a user3 el privilegi UPDATE només sobre la columna address de la taula employee.&lt;br /&gt;
&lt;br /&gt;
17. Comprova els privilegis concedits sobre la taula employee, incloent columnes específiques, utilitzant la vista DBA_TAB_PRIVS.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 6: Atorgar el privilegi de donar un privilegi'''&lt;br /&gt;
&lt;br /&gt;
18. Atorga a user2 el privilegi SELECT sobre la taula employee amb l’opció de concedir aquest privilegi a altres usuaris.&lt;br /&gt;
&lt;br /&gt;
19. Inicia sessió com user2 i concedeix el privilegi SELECT sobre la taula employee a user3.&lt;br /&gt;
&lt;br /&gt;
20. Comprova els privilegis de user3 sobre la taula employee utilitzant el diccionari de dades.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 7: Revocació d'un privilegi amb efectes propagats'''&lt;br /&gt;
&lt;br /&gt;
21. Revoca el privilegi SELECT de user2 sobre la taula employee i observa què passa amb user3.&lt;br /&gt;
&lt;br /&gt;
22. Comprova si user3 encara pot accedir a la taula employee.&lt;br /&gt;
&lt;br /&gt;
23. Explica per què user3 perd el privilegi SELECT quan aquest es revoca de user2.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 8: Assignació de privilegis a rols i usuaris'''&lt;br /&gt;
&lt;br /&gt;
24. Concedeix el rol role_readonly a user2 i assigna-li els privilegis SELECT i UPDATE en la taula employee.&lt;br /&gt;
&lt;br /&gt;
25. Crea una vista view_employee_salary per user1 que mostri només l’emp_id i salary de la taula employee. Concedeix el privilegi SELECT en aquesta vista a user3.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 9: Modificació d'usuaris i rols'''&lt;br /&gt;
&lt;br /&gt;
26. Canvia la contrasenya de user1 a newpassword1 i afegeix el privilegi DROP TABLE al rol role_admin.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 10: Revocació de privilegis a usuaris i rols'''&lt;br /&gt;
&lt;br /&gt;
27. Revoca el privilegi UPDATE de la taula employee del rol role_readonly.&lt;br /&gt;
&lt;br /&gt;
28. Revoca el rol role_admin de user3.&lt;br /&gt;
&lt;br /&gt;
Activitat 11: Consultes sobre privilegis al diccionari de dades&lt;br /&gt;
&lt;br /&gt;
29. Consulta el diccionari de dades per llistar tots els privilegis de sistema assignats a user2.&lt;br /&gt;
&lt;br /&gt;
30. Llista tots els privilegis d'objecte assignats al rol role_admin.&lt;br /&gt;
&lt;br /&gt;
31. Llista tots els usuaris i rols que tenen el privilegi SELECT sobre la taula employee.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 12: Bloqueig i desbloqueig d'usuaris'''&lt;br /&gt;
&lt;br /&gt;
32. Bloqueja l'usuari user1 per evitar que es pugui connectar a la base de dades.&lt;br /&gt;
&lt;br /&gt;
33. Comprova l’estat de l’usuari user1 utilitzant la vista DBA_USERS.&lt;br /&gt;
&lt;br /&gt;
34. Desbloqueja l'usuari user1 per permetre-li connectar-se novament.&lt;br /&gt;
&lt;br /&gt;
35. Fes una consulta que llisti tots els usuaris bloquejats en la base de dades.&lt;br /&gt;
&lt;br /&gt;
'''Activitat 13: Eliminació d'usuaris i rols'''&lt;br /&gt;
&lt;br /&gt;
36. Elimina el rol role_readonly i els usuaris user2 i user3.&lt;br /&gt;
&lt;br /&gt;
37. Elimina la taula employee i la vista view_employee_salary de l'esquema user1 (connecta't com user1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Administració Oracle==&lt;br /&gt;
&lt;br /&gt;
1.Crear un tablespace de nombre compras asociándole un fichero en disco llamado ‘COMPRAS.ORA’ de 5 Mb.&lt;br /&gt;
&lt;br /&gt;
2.Modificar el tablespace anterior para que pueda autoextenderse automáticamente, sin límite de espacio en disco.&lt;br /&gt;
&lt;br /&gt;
3. Crear el usuario RH. Tablespace por defecto: users, Tablespace temporal: Temp. Asignar al usuario RH los roles CONNECT i RESOURCE.&lt;br /&gt;
&lt;br /&gt;
4. Crear las tablas como RH. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE CLIENTE (&lt;br /&gt;
DNI VARCHAR2(10),&lt;br /&gt;
NOMBRE VARCHAR2(20),&lt;br /&gt;
FECHA_NAC DATE NOT NULL,&lt;br /&gt;
DIRECCION VARCHAR2(200),&lt;br /&gt;
TFNO VARCHAR2(10),&lt;br /&gt;
APELLIDOS VARCHAR2(100),&lt;br /&gt;
CONSTRAINT CLIENTE_PK PRIMARY KEY (DNI));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE PROVEEDOR(&lt;br /&gt;
NIF VARCHAR2(10),&lt;br /&gt;
NOMBRE VARCHAR2(20),&lt;br /&gt;
DIRECCION VARCHAR2(200),&lt;br /&gt;
TFNO VARCHAR2(10),&lt;br /&gt;
CONSTRAINT PROVEEDOR_PK PRIMARY KEY (NIF));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5.Amb l'usuari SYSTEM, crear un rol que tenga los siguientes privilegios: INSERT y  SELECT  en las tablas RH.CLIENTE y RH.PROVEEDOR, CREATE SESSION, CREATE DATABASE LINK, CREATE TABLE y  CREATE VIEW.&lt;br /&gt;
&lt;br /&gt;
6.Crear un usuario llamado COMPRADOR. El tablespace por defecto es COMPRAS. Se le asigna  1Mb en el tablespace COMPRAS y 0 de cuota en el tablespace SYSTEM. El tablespace temporal será TEMP. Asignarle el rol anterior. &lt;br /&gt;
&lt;br /&gt;
7.Crear un usuario de base de datos llamado ‘administrador’ que tenga funciones de administrador, ponedle de pasword administrador &lt;br /&gt;
&lt;br /&gt;
8.Conectarse con el nombre de usuario creado anteriormente. &lt;br /&gt;
&lt;br /&gt;
9.Crear varias tablas  como administrador. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE CLIENTE (&lt;br /&gt;
DNI VARCHAR2(10),&lt;br /&gt;
NOMBRE VARCHAR2(20),&lt;br /&gt;
FECHA_NAC DATE NOT NULL,&lt;br /&gt;
DIRECCION VARCHAR2(200),&lt;br /&gt;
TFNO VARCHAR2(10),&lt;br /&gt;
APELLIDOS VARCHAR2(100),&lt;br /&gt;
CONSTRAINT CLIENTE_PK PRIMARY KEY (DNI));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE PROVEEDOR(&lt;br /&gt;
NIF VARCHAR2(10),&lt;br /&gt;
NOMBRE VARCHAR2(20),&lt;br /&gt;
DIRECCION VARCHAR2(200),&lt;br /&gt;
TFNO VARCHAR2(10),&lt;br /&gt;
CONSTRAINT PROVEEDOR_PK PRIMARY KEY (NIF));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt; &lt;br /&gt;
CREATE TABLE PRODUCTO(&lt;br /&gt;
NOMBRE VARCHAR2(50),&lt;br /&gt;
CODIGO VARCHAR2(50),&lt;br /&gt;
PRECIO NUMBER(10) NOT NULL,&lt;br /&gt;
PRV_NIF VARCHAR2(10),&lt;br /&gt;
CONSTRAINT PRODUCTO_PK PRIMARY KEY (CODIGO),&lt;br /&gt;
CONSTRAINT PROVEEDOR_FK FOREIGN KEY(PRV_NIF) REFERENCES PROVEEDOR (NIF));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE CLIENTE_PRODUCTO(&lt;br /&gt;
PRD_CODIGO VARCHAR2(50),&lt;br /&gt;
CLN_DNI VARCHAR2(10),&lt;br /&gt;
CONSTRAINT CLIENTE_PRODUCTO_PK PRIMARY KEY (PRD_CODIGO, CLN_DNI),&lt;br /&gt;
CONSTRAINT PRODUCTOCP_FK FOREIGN KEY (PRD_CODIGO) REFERENCES PRODUCTO(CODIGO),&lt;br /&gt;
CONSTRAINT CLIENTECP_FK FOREIGN KEY (CLN_DNI) REFERENCES CLIENTE(DNI));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10.Crear 5 usuarios nuevos ( USU1, USU2, USU3, USU4, USU5) con la misma contraseña que el nombre, asignándoles el tablespace COMPRAS y una cuota de 2M &lt;br /&gt;
&lt;br /&gt;
11.Dar permiso a USU1 sólo para que pueda conectarse a la BD.&lt;br /&gt;
&lt;br /&gt;
12.Crear un rol que permita conectarse a la BD y hacer SELECT sobre las tablas definidas en el ejercicio 9. &lt;br /&gt;
&lt;br /&gt;
13.Asignar el rol creado a los usuarios USU2 y USU3. &lt;br /&gt;
&lt;br /&gt;
14.Conceder al usuario USU4 privilegios INSERT y DELETE sobre las tablas CLIENTE y PROVEEDOR con la opción de poder concedérselos a otros usuarios. &lt;br /&gt;
&lt;br /&gt;
15.Conceder al usuario USU5 cuatro privilegios de sistema, dos de ellos con la opción de poder concedérselos a otros usuarios. &lt;br /&gt;
&lt;br /&gt;
16. Conceder a todos los usuarios de la BD privilegios para que puedan modificar las columnas  DIRECCION y TFNO de las tablas CLIENTE y PROVEEDOR. &lt;br /&gt;
&lt;br /&gt;
17.Quitar a los usuarios USU3 y USU4 todos los privilegios que tenían asignados. &lt;br /&gt;
&lt;br /&gt;
18. Comprovar la limitació de recursos. En cas de que no estigui activa, activar-la.&lt;br /&gt;
&lt;br /&gt;
19.Hacer que USU5 sólo pueda conectarse en dos sesiones concurrentes a la vez. &lt;br /&gt;
&lt;br /&gt;
20.Limitar el tiempo de conexión a la BD a 5 minutos a los usuarios USU2 y USU3.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions Administració Oracle | Solucions Administració Oracle]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Accés a la base de dades==&lt;br /&gt;
&lt;br /&gt;
1.Crear un usuario 'USER1' con autentificación de contraseña ('insti'). Otorgale el privilegio de iniciar sesión.&lt;br /&gt;
&lt;br /&gt;
2.Entrar como 'USER1' y cambiar la contraseña a 'merce'.&lt;br /&gt;
&lt;br /&gt;
3.Crea el tablespace de nombre usuarios asociándole un fichero en disco llamado 'USUARIOS.ORA' de 5 Mb.&lt;br /&gt;
Asignar el tablespace usuarios y como temporal el tablespace temp a 'USER1'.&lt;br /&gt;
&lt;br /&gt;
4.Bloqueamos la cuenta de 'USER1'.&lt;br /&gt;
&lt;br /&gt;
5.Desbloqueamos la cuenta de 'USER1'.&lt;br /&gt;
&lt;br /&gt;
6.Conceder privilegios a 'USER1' para que pueda conectarse, crear tablas, vistas, secuencias y tipos. Permitirle que pueda conceder estos privilegios a otros usuarios.&lt;br /&gt;
&lt;br /&gt;
7.Revocar los privilegios concedidos a 'USER1'.&lt;br /&gt;
&lt;br /&gt;
8.Conceder los privilegios INSERT, UPDATE, DELETE y SELECT para la tabla ‘cliente’ (RH.cliente) a 'USER1'.&lt;br /&gt;
&lt;br /&gt;
9.Conceder todos los privilegios para la tabla ‘dept’ a 'USER1' incluyendo que pueda conceder estos privilegios a otros usuarios.&lt;br /&gt;
&lt;br /&gt;
10.Queremos que un usuario llamado 'USER2' (crearlo), con contraseña 'merce', sólo pueda hacer INSERT en las columnas (DNI, nombre), UPDATE en las columnas (direccion, telefono) y REFERENCES en la columna (DNI) y SELECT en todas las columnas de la tabla 'cliente' de 'RH'.&lt;br /&gt;
&lt;br /&gt;
11.Revocar el privilegio references a 'USER2'.&lt;br /&gt;
&lt;br /&gt;
12.Crear un rol para los programadores de aplicaciones del sistema llamado 'PAS' con contraseña ‘sistema’.&lt;br /&gt;
&lt;br /&gt;
13.Conceder los privilegios  de sistema CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE ANY INDEX, CREATE SÉQUENCE, CREATE TYPE al rol 'PAS' creado anteriormente.&lt;br /&gt;
&lt;br /&gt;
14.Conceder los privilegios  de objeto INSERT, UPDATE, DELETE, SELECT sobre la tabla 'cliente' al rol 'PAS'.&lt;br /&gt;
&lt;br /&gt;
15.Conceder el rol 'PAS' al usuario 'USER2'.&lt;br /&gt;
&lt;br /&gt;
16.Conceder el rol PAS'al usuario 'USER1'.&lt;br /&gt;
&lt;br /&gt;
17.Conceder al usuario 'USER2' el derecho de 5mb de espacio en el espacio de tabla USERS.&lt;br /&gt;
&lt;br /&gt;
18.Conceder al usuario 'USER2' el derecho de cantidad ilimitada  de espacio en el espacio de tabla USERS.&lt;br /&gt;
&lt;br /&gt;
19.Conceder al usuario 'USER1'  cuota ilimitada a todos los espacios de tablas.&lt;br /&gt;
&lt;br /&gt;
ACTIVACIÓ DE PERFILS:&lt;br /&gt;
&lt;br /&gt;
ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;&lt;br /&gt;
&lt;br /&gt;
20.Crear un perfil 'LIMREC con los límites de recursos siguientes: máximo de 5 sesiones de BD concurrentes abiertas, CPU por sesión ilimitada, CPU por petición de BD 30 segundos, tiempo de conexión activa ilimitado,  estar inactivo durante un tiempo máximo de 30 minutos, lecturas lógicas por sesión ilimitadas y lecturas lógicas por petición 1000. &lt;br /&gt;
&lt;br /&gt;
21.Modificar el perfil anterior ajustando la contraseña de administración a: bloquear la cuenta tras tres intentos consecutivos sin éxito, si se bloquea la cuenta mantener esta bloqueada durante todo un día, tiempo de vida para la contraseña de 30 días más un periodo de grácia de cinco días, el perfil de usuario no puede volver a usar una contraseña antigua.&lt;br /&gt;
&lt;br /&gt;
22.Hacer que caduque la contraseña de 'USER2'. &lt;br /&gt;
&lt;br /&gt;
23.Asignar a USER1 el perfil 'LIMREC'. &lt;br /&gt;
&lt;br /&gt;
24.Deshabilitar la administración de contraseñas para el perfil predeterminado de la BD.&lt;br /&gt;
&lt;br /&gt;
25. Mostrar información (status del compte, tablespace per defecte i tablespace temporal i perfil) acerca de los usuarios 'USER1' y 'USER2'. Vista DBA_USERS.  &lt;br /&gt;
&lt;br /&gt;
26.Mostrar información sobre los roles de la base de datos. &lt;br /&gt;
&lt;br /&gt;
27.Mostrar información acerca de las cuotas de espacio de tablas. &lt;br /&gt;
&lt;br /&gt;
28.Mostrar información acerca del perfil ‘LIMREC’.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Accés a la base de dades | Solucions Accés a la base de dades]]&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Gestió d'usuaris==&lt;br /&gt;
&lt;br /&gt;
1. Buscar en la bd el contenido de las vistas: dba_profiles ; dba_roles; dba_users; dba_role_privs ; dba_tab_privs ; dba_sys_privs. (antes de hacer select * sobre estas vistas consultar con un  describe o desc las columnas que nos interesan)&lt;br /&gt;
&lt;br /&gt;
2. Crear un usuario llamado “administrador” autentificado por la base de datos. Indicar como &amp;quot;tablespace&amp;quot; por defecto USERS y como &amp;quot;tablespace&amp;quot; temporal TEMP; asignar una cuota de 500K en el &amp;quot;tablespace&amp;quot; USERS. &lt;br /&gt;
&lt;br /&gt;
3. Abrir una sesión sqlplus e intentar conectaros como usuario “administrador”, ¿qué sucede?, ¿por qué?. &lt;br /&gt;
&lt;br /&gt;
4. Averiguar qué privilegios de sistema, roles y privilegios sobre objetos tiene concedidos el usuario “administrador”. &lt;br /&gt;
&lt;br /&gt;
5. Otorgar el privilegio “CREATE SESSION” al usuario “administrador” e intentar de nuevo la conexión sqlplus. &lt;br /&gt;
&lt;br /&gt;
6. Conectarse como usuario “administrador” y crear un usuario llamado “prueba00” que tenga como &amp;quot;tablespace&amp;quot; por defecto USERS y como &amp;quot;tablespace&amp;quot; temporal TEMP; asignar una cuota de 0K en el &amp;quot;tablespace&amp;quot; USERS. ¿Es posible hacerlo?. &lt;br /&gt;
&lt;br /&gt;
7.  Conectado como usuario SYSTEM, otorgar el privilegio “create user” al usuario “administrador” y repetir el ejercicio anterior. &lt;br /&gt;
&lt;br /&gt;
8. Averiguar que usuarios de la base de datos tienen asignado el privilegio “create user” de forma directa, ¿qué vista debe ser consultada?. &lt;br /&gt;
&lt;br /&gt;
9. Hacer lo mismo para el privilegio “create session”. &lt;br /&gt;
&lt;br /&gt;
10. Crear dos &amp;quot;tablespace&amp;quot; llamados NOMINA y ACADEMO, que contendrán datos relativos a las aplicaciones de nomina y datos académicos de los empleados de una empresa, según las siguientes características:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_10.png |600px|center| tablespace]]&lt;br /&gt;
&lt;br /&gt;
11. Crear dos &amp;quot;tablespace&amp;quot; temporales, manejados de forma local, llamados TEMP_NOMINA y TEMP_ACADEMO con las siguientes características: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_11.png |500px|center| tablespace]]&lt;br /&gt;
&lt;br /&gt;
12. Estando conectado como usuario “administrador” probar a crear un rol llamado “administrador”, ¿qué ocurre?. &lt;br /&gt;
&lt;br /&gt;
13. Idem estando conectado como usuario SYSTEM, ¿qué sucede?, ¿por qué?. &lt;br /&gt;
&lt;br /&gt;
14. Comprobar en el diccionario de datos los usuarios o roles que poseen el privilegio “CREATE ROLE”. &lt;br /&gt;
&lt;br /&gt;
15. Crear un rol llamado “ADMIN”, asignarle los privilegios “create session”, “cr eate user” y “CREATE ROLE”. Asignarlo al usuario administrador. &lt;br /&gt;
&lt;br /&gt;
16. Consultar los privilegios de sistema que tiene asignados de forma directa el usuario “administrador”, revocarlos y asignarle el rol “admin.”. &lt;br /&gt;
&lt;br /&gt;
17. Crear, conectado como SYSTEM, un usuario llamado “prueba01” autenticado por base de datos al que no se le asigne &amp;quot;tablespace&amp;quot; por defecto ni temporal. &lt;br /&gt;
&lt;br /&gt;
18. Consultar en las vistas correspondientes los &amp;quot;tablespaces&amp;quot; y la quota en cada uno de ellos que tiene los usuarios SYS, SYSTEM, “administrador”, “prueba00” y “prueba01”. ¿Qué ha ocurrido con el usuario “prueba01”?. &lt;br /&gt;
&lt;br /&gt;
19. Crear un usuario llamado “prueba02” autenticado por base de datos, asignando como &amp;quot;tablespace&amp;quot; por defecto NOMINA y como &amp;quot;tablespace&amp;quot; temporal TEMP_NOMINA (no se le asignara cuota en NOMINA). &lt;br /&gt;
&lt;br /&gt;
20.  Asignar al usuario “prueba01” los &amp;quot;tablespace&amp;quot; ACADEMO y TEMP_ACADEMO como &amp;quot;tablespace&amp;quot; de trabajo y temporal respectivamente (sin especificar cuota). &lt;br /&gt;
&lt;br /&gt;
21. Consultar en las vistas correspondientes los &amp;quot;tablespace&amp;quot; y la cuota en cada uno de ellos que tiene los usuarios “prueba01” y “prueba02”. &lt;br /&gt;
&lt;br /&gt;
22. Crear un rol llamado “CONEXIÓN” y asignarle el permiso “CREATE SESSION”. &lt;br /&gt;
&lt;br /&gt;
23. Asignar el rol “CONEXIÓN” a los usuarios “prueba00”, “prueba01” y “prueba02” &lt;br /&gt;
&lt;br /&gt;
24. Comprobar en la vista correspondiente cuales son los roles asignados a los usuarios “prueba00”, “prueba01” y “prueba02”. &lt;br /&gt;
&lt;br /&gt;
25. Conectarse como usuario “prueba01” y crear la tabla siguiente en el &amp;quot;tablespace&amp;quot;  ACADEMO: &lt;br /&gt;
&lt;br /&gt;
:::CREATE TABLE CODIGOS &lt;br /&gt;
:::(CODIGO varchar2(3), &lt;br /&gt;
:::DESCRIPCION varchar2(20)) &lt;br /&gt;
:::TABLESPACE ACADEMO &lt;br /&gt;
:::STORAGE (INITIAL 64K &lt;br /&gt;
:::NEXT 64K &lt;br /&gt;
:::MINEXTENTS 5 &lt;br /&gt;
:::MAXEXTENTS 10); &lt;br /&gt;
&lt;br /&gt;
¿Es posible hacerlo?, ¿falta algún permiso?. &lt;br /&gt;
&lt;br /&gt;
26. Crear un rol llamado “DESARROLLO” y asignarle los permisos &amp;quot;CREATE SEQUENCE&amp;quot;, &amp;quot;CREATE SESSION&amp;quot;, &amp;quot;CREATE SYNONYM&amp;quot;, &amp;quot;CREATE TABLE&amp;quot; y &amp;quot;CREATE VIEW&amp;quot;. Asignar el rol “DESARROLLO” a los usuarios “prueba00”, “prueba01” y “prueba02”. &lt;br /&gt;
&lt;br /&gt;
27. Volver a conectarse como usuario “prueba01” y crear la tabla anterior en el &amp;quot;tablespace&amp;quot; ACADEMO. &lt;br /&gt;
&lt;br /&gt;
28. Asignar cuota ilimitada al usuario “prueba01” en el &amp;quot;tablespace&amp;quot; ACADEMO. Volver a repetir el ejercicio 27.&lt;br /&gt;
&lt;br /&gt;
29. Asignar cuota ilimitada al usuario “prueba02” en el &amp;quot;tablespace&amp;quot; NOMINA.&lt;br /&gt;
 &lt;br /&gt;
30. Obtener información sobre roles, privilegios de sistema, &amp;quot;tablespace&amp;quot; y cuotas para los usuarios “prueba00”, “prueba01” y “prueba02”. &lt;br /&gt;
&lt;br /&gt;
31. Asignar cuota cero en el &amp;quot;tablespace&amp;quot; por defecto para el usuario “prueba01”, ¿siguen estando sus objetos?, ¿es posible crear algún otro? (probad a crear un tabla). &lt;br /&gt;
&lt;br /&gt;
32. Conectarse como usuario “prueba01” e intentar modificar su cuota en el &amp;quot;tablespace&amp;quot; ACADEMO, ¿es posible?. &lt;br /&gt;
&lt;br /&gt;
33. Conectarse como usuario “prueba01” y modificar su clave, ¿es posible?. &lt;br /&gt;
&lt;br /&gt;
34. Averiguar que usuarios o roles de base de datos tienen asignado el privilegio ALTER USER. &lt;br /&gt;
&lt;br /&gt;
35. Abrir una sesión con el usuario “administrador” y otra con el usuario “prueba02”. Siendo el usuario “administrador”, intentar borrar el usuario “prueba02”. &lt;br /&gt;
&lt;br /&gt;
36. .Asignar el permiso DROP USER al rol ADMIN. &lt;br /&gt;
&lt;br /&gt;
37. Averiguar que usuarios o roles de base de datos tienen asignado el privilegio DROP USER. &lt;br /&gt;
&lt;br /&gt;
38. Conectado como usuario &amp;quot;administrador&amp;quot;, crear el usuario “prueba03” autentificado por base de datos y asignando cuotas en el &amp;quot;tablespace&amp;quot; ACADEMO (500K) y NOMINA (200K). Su &amp;quot;tablespace&amp;quot; por defecto serà ACADEMO i su tablespace temporal será TEMP. &lt;br /&gt;
&lt;br /&gt;
39. Comprobar en el fichero de inicialización si está activado el modo de limitación de recursos. &lt;br /&gt;
&lt;br /&gt;
40. Averiguar que usuarios de base de datos o que roles tienen asignado el privilegio “CREATE PROFILE”. &lt;br /&gt;
&lt;br /&gt;
41. Asignar el permiso “CREATE PROFILE” al rol ADMIN. &lt;br /&gt;
&lt;br /&gt;
42. Averiguar que perfiles están definidos en la base de datos y que límites de recursos fija cada uno de ellos. &lt;br /&gt;
&lt;br /&gt;
43. Consultar que perfiles tiene asignados cada usuario de la base de datos. &lt;br /&gt;
&lt;br /&gt;
44. Crear un perfil llamado “DESARROLLO” con las siguientes especificaciones:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_44.png |500px|center| perfil]]&lt;br /&gt;
&lt;br /&gt;
45. Asignar el perfil anterior a los usuarios “prueba00”, “prueba01”, “prueba02” y “prueba03”. &lt;br /&gt;
&lt;br /&gt;
46. Intentar la conexión dos veces como usuario “prueba01” fallando la contraseña, ¿qué sucede?. Comprobar si la cuenta ha sido bloqueada en la vista de base de datos correspondiente .&lt;br /&gt;
&lt;br /&gt;
47. Crear un usuario “prueba04” con el parámetro “password expire”, sus &amp;quot;tablespace&amp;quot; por defecto y temporal serán USERS (cuota 0k) y TEMP. Asignar los roles CONEXIÓN y DESARROLLO. Conectarse como usuario “prueba04”, ¿qué sucede?. &lt;br /&gt;
&lt;br /&gt;
48. Bloquear la cuenta del usuario “prueba04”, ¿qué sucede al conectarse de nuevo?. &lt;br /&gt;
&lt;br /&gt;
49. .Modificar el &amp;quot;tablespace&amp;quot; por defecto y el temporal del usuario “prueba01” de forma que sean NOMINA y TEMP_NOMINA. &lt;br /&gt;
&lt;br /&gt;
50. Comprobar cual es el valor del parámetro OS_AUTHENT_PREFIX en la base de datos. (en init&amp;lt;SID&amp;gt;.ora)&lt;br /&gt;
&lt;br /&gt;
51. Cambia la identificación del usuario “prueba01” de forma que sea identificado por el sistema operativo. &lt;br /&gt;
&lt;br /&gt;
52. Modificar el parámetro OS_AUTHENT_PREFIX de forma que, en adelante, la cadena que identifique a un usuario externo sea “” (cadena vacía). (en el  fichero de parámetros de inicializacion (init&amp;lt;SID&amp;gt;.ora). Indicar: os_authent_prefix = &amp;quot;&amp;quot; &lt;br /&gt;
&lt;br /&gt;
53. Desbloquear la cuenta del usuario “prueba04”. &lt;br /&gt;
&lt;br /&gt;
54. Modificar los valores del perfil DEFAULT según se indica en la siguiente tabla:&lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_54.png |500px|center| perfil]]&lt;br /&gt;
&lt;br /&gt;
55. Averiguar que usuarios o roles tienen asignado el privilegio “ALTER PROFILE”.&lt;br /&gt;
 &lt;br /&gt;
56. Asignar el privilegio anterior al rol ADMIN. &lt;br /&gt;
&lt;br /&gt;
57. Comprobar los valores asignados al perfil “DESARROLLO”. Modificar el perfil “DESARROLLO”, desde el usuario “administrador”, según la siguiente tabla: &lt;br /&gt;
&lt;br /&gt;
[[Imatge:gest_usu_57.png |500px|center| perfil]]&lt;br /&gt;
&lt;br /&gt;
¿Qué ha sucedido con el resto de los parámetros?. ¿Coincide el valor de “Connect_time” en este perfil con el que tiene en el perfil DEFAULT?. &lt;br /&gt;
&lt;br /&gt;
58. Averiguar los privilegios de sistema y sobre objetos, así como los roles, que tiene asignados los roles por defecto “CONNECT”, “RESOURCE”, “DBA”, “EXP_FULL_DATABASE” e “IMP_FULL_DATABASE”. ¿Consideras una buena política de seguridad asignar el rol “CONNECT” a todos los usuarios que precisan conectarse a la base de datos?. &lt;br /&gt;
&lt;br /&gt;
59. ¿Puede asignarse el perfil “DESARROLLO” al rol “CONNECT”?. ¿Y el perfil “DEFAULT” al perfil “DESARROLLO”? &lt;br /&gt;
&lt;br /&gt;
60. Averiguar que usuarios o roles de la base de datos tienen asignado el privilegio “DROP PROFILE”. &lt;br /&gt;
&lt;br /&gt;
61. Asignar el privilegio “DROP PROFILE” al rol “ADMIN.”. &lt;br /&gt;
&lt;br /&gt;
62. Conectarse como usuario “administrador” e intentar eliminar el perfil “DEFAULT”, ¿qué ocurre?. &lt;br /&gt;
&lt;br /&gt;
63. Como usuario “administrador” crear el rol “SECRETO” identificado por la contraseña “total” y asignarlo al usuario “prueba04”. &lt;br /&gt;
&lt;br /&gt;
64. Averiguar que usuarios poseen el privilegio “ALTER ANY ROLE” (de forma directa o a través de roles). &lt;br /&gt;
&lt;br /&gt;
65. ¿Qué valor tiene en la base de datos el parámetro MAX_ENABLED_ROLES?. Modificar su valor para que, en adelante, valga 40. Comprobar esta modificación. &lt;br /&gt;
&lt;br /&gt;
66. Averiguar que usuarios poseen el privilegio “GRANT ANY ROLE” (de forma directa o a través de roles). &lt;br /&gt;
&lt;br /&gt;
67. Como usuario “administrador”, deasignar el rol “SECRETO” al usuario “prueba04”. &lt;br /&gt;
&lt;br /&gt;
68. Asignar el privilegio “GRANT ANY ROLE” al rol “ADMIN.”. &lt;br /&gt;
&lt;br /&gt;
69. Averiguar de nuevo que usuarios poseen el privilegio “GRANT ANY ROLE” (de forma directa o a través de roles). &lt;br /&gt;
&lt;br /&gt;
70. Averiguar que usuarios poseen el privilegio “DROP ANY ROLE” (de forma directa o a través de roles). &lt;br /&gt;
&lt;br /&gt;
71. Asignar permiso de conexión al usuario &amp;quot;prueba03&amp;quot;, asignar el rol “SECRETO” al mismo usuario. Conectarse como este usuario e intentar borrar el rol. &lt;br /&gt;
&lt;br /&gt;
72. En caso de que no lo tenga asignado, asignar el rol “CONEXION” y el rol “DESARROLLO” al usuario “prueba04”. Hacer que solo el rol “CONEXIÓN” este activo &lt;br /&gt;
cuando se conecte. &lt;br /&gt;
&lt;br /&gt;
73. Comprobar en la vista apropiada del diccionario de datos los roles activos en la sesión. &lt;br /&gt;
&lt;br /&gt;
74. Conectado como usuario “prueba04”, activar el rol “DESARROLLO” y comprobar de nuevo en la vista apropiada del diccionario de datos los roles activos en la sesión. &lt;br /&gt;
&lt;br /&gt;
75. Asignar el rol &amp;quot;CONNECT&amp;quot; al usuario &amp;quot;ADMIN&amp;quot;. ¿Es preciso asignarle los permisos &amp;quot;CREATE PROCEDURE&amp;quot;, &amp;quot;CREATE PUBLIC SYNONYM&amp;quot;, &amp;quot;CREATE ROLE&amp;quot;, &amp;quot;CREATE TRIGGER&amp;quot;?, ¿Los tiene ya asignados?. &lt;br /&gt;
&lt;br /&gt;
76. Conectarse como usuario SYSTEM y otorgar al usuario &amp;quot;prueba02&amp;quot; el permiso para seleccionar datos de la tabla códigos (pertenece al usuario &amp;quot;prueba01&amp;quot;). ¿Qué sucede?, ¿por qué?. &lt;br /&gt;
&lt;br /&gt;
77. Conectarse como usuario &amp;quot;prueba01&amp;quot; y otorgar al usuario &amp;quot;prueba02&amp;quot; el permiso para seleccionar datos de la tabla códigos; hacerlo de forma que &amp;quot;prueba02&amp;quot; también pueda otorgar el permiso a otros usuarios (opción ADMIN). &lt;br /&gt;
&lt;br /&gt;
78. Conectarse como usuario &amp;quot;prueba02&amp;quot; y otorgar al usuario &amp;quot;prueba03&amp;quot; el permiso para seleccionar datos de la tabla códigos. &lt;br /&gt;
&lt;br /&gt;
79. Conectarse como usuario &amp;quot;prueba01&amp;quot; y revocar al usuario &amp;quot;prueba02&amp;quot; el permiso para seleccionar datos de la tabla códigos. &lt;br /&gt;
&lt;br /&gt;
80. Conectarse como usuario &amp;quot;prueba03&amp;quot; e intentar consultar la tabla códigos. ¿Qué ocurre?, ¿por qué?.&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions Gestió d'usuaris | Solucions Gestió d'usuaris]]&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Solucions_UF2_BD_HR:_Llenguatges_SQL:_DDL,_DML_i_DCL&amp;diff=18732</id>
		<title>M2 - Bases de dades / Solucions UF2 BD HR: Llenguatges SQL: DDL, DML i DCL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Solucions_UF2_BD_HR:_Llenguatges_SQL:_DDL,_DML_i_DCL&amp;diff=18732"/>
				<updated>2025-01-10T14:18:24Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Llenguatge de manipulació de dades===&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Solucions T9-HR | T9- Manipulación de datos]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Llenguatge de definició de dades===&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Solucions T10-HR | T10- Crear y gestionar tablas]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Solucions T11-HR | T11- Creación de otros objetos de esquema]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Llenguatge de control de dades===&lt;br /&gt;
&lt;br /&gt;
:*[[M0484 - Bases de dades / Exercicis RA2: Llenguatges SQL / Solucions DCL | Solucions pràctica llenguatge de control de dades]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Solucions_UF2_BD_HR:_Llenguatges_SQL:_DDL,_DML_i_DCL&amp;diff=18731</id>
		<title>M2 - Bases de dades / Solucions UF2 BD HR: Llenguatges SQL: DDL, DML i DCL</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Solucions_UF2_BD_HR:_Llenguatges_SQL:_DDL,_DML_i_DCL&amp;diff=18731"/>
				<updated>2025-01-10T14:18:01Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Llenguatge de manipulació de dades===&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Solucions T9-HR | T9- Manipulación de datos]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Llenguatge de definició de dades===&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Solucions T10-HR | T10- Crear y gestionar tablas]]&lt;br /&gt;
&lt;br /&gt;
:*[[M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Solucions T11-HR | T11- Creación de otros objetos de esquema]]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Llenguatge de control de dades===&lt;br /&gt;
&lt;br /&gt;
:*[[M0484 - Bases de dades / Exercicis RA2: Llenguatges SQL / Solucions DCL | Solucions pràctica llenguatge de control de dades]]&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T9-HR&amp;diff=18623</id>
		<title>M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Exercicis T9-HR</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T9-HR&amp;diff=18623"/>
				<updated>2024-11-27T13:58:32Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El departamento de recursos humanos desea que cree sentencias SQL para insertar, actualizar y suprimir datos de los empleados. Como prototipo, utilizará la tabla MY_EMPLOYEE , antes de proporcionar las sentencias al departamento.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' para todas las sentencias DML, utilice el icono Run Script (o pulse [F5]) para ejecutar la consulta. De esta forma, ve los mensajes de comentarios en la página con separadores Script Output. Para consultas SELECT , siga utilizando el icono Execute Statement o pulse [F9] para obtener la salida con formato en la página con separadores Results.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Inserte los datos en la tabla MY_EMPLOYEE .&lt;br /&gt;
&lt;br /&gt;
1) Ejecute la siguiente sentencia para crear la tabla MY_EMPLOYEE utilizada en esta práctica.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE MY_EMPLOYEE (&lt;br /&gt;
     ID NUMBER(4) PRIMARY KEY,&lt;br /&gt;
     LAST_NAME VARCHAR2(25) NOT NULL,&lt;br /&gt;
     FIRST_NAME VARCHAR2(25) NOT NULL,&lt;br /&gt;
     USERID VARCHAR2(8),&lt;br /&gt;
     SALARY NUMBER(9,2));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Describa la estructura de la tabla MY_EMPLOYEE para identificar los nombres de las columnas.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DESCRIBE MY_EMPLOYEE;&lt;br /&gt;
Nombre          Nulo     Tipo         &lt;br /&gt;
--------------- -------- ------------ &lt;br /&gt;
ID              NOT NULL NUMBER(4)    &lt;br /&gt;
LAST_NAME       NOT NULL VARCHAR2(25) &lt;br /&gt;
FIRST_NAME      NOT NULL VARCHAR2(25) &lt;br /&gt;
USERID                   VARCHAR2(8)     &lt;br /&gt;
SALARY                   NUMBER(9,2)    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Els següents apartats fan referencia a les dades de la següent taula:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|ID&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|LAST_NAME&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;120 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|FIRST_NAME&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;85 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|USERID&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;85 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|SALARY&lt;br /&gt;
|-&lt;br /&gt;
|1||Patel||Ralph||rpatel||895&lt;br /&gt;
|-&lt;br /&gt;
|2||Dancs||Betty||bdancs||860&lt;br /&gt;
|-&lt;br /&gt;
|3||Biri||Ben||bbiri||1100&lt;br /&gt;
|-&lt;br /&gt;
|4||Newman||Chad||cnewman||750&lt;br /&gt;
|-&lt;br /&gt;
|5||Ropeburn||Audry||aropebur||1550&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
3) Cree una sentencia INSERT para agregar la primera fila de datos a la tabla MY_EMPLOYEE a partir de los siguientes datos de ejemplo. No muestre la lista de columnas en la cláusula INSERT. No introduzca aún todas las filas.&lt;br /&gt;
&lt;br /&gt;
4) Rellene la tabla MY_EMPLOYEE con la segunda fila de datos de ejemplo de la lista anterior. En esta ocasión, muestre explícitamente la lista de columnas en la cláusula INSERT .&lt;br /&gt;
&lt;br /&gt;
5) Confirme las adiciones a la tabla.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  ID  LAST_NAME  FIRST_NAME  USERID  SALARY &lt;br /&gt;
  --  ---------  ----------  ------  ------&lt;br /&gt;
1  1  Patel      Ralph       rpatel     895 &lt;br /&gt;
2  2  Dancs      Betty       bdancs     860&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6) Escriba una sentencia INSERT en un archivo de script reutilizable para cargar las filas restantes en la tabla MY_EMPLOYEE . El script se debe solicitar para todas las columnas ( ID , LAST_NAME , FIRST_NAME , USERID y SALARY ). &lt;br /&gt;
&lt;br /&gt;
7) Rellene la tabla con las dos siguientes filas de ejemplo mostradas en el paso 3 mediante la ejecución de la sentencia INSERT en el script que ha creado.&lt;br /&gt;
&lt;br /&gt;
8) Visualize todos los empleados y comprueba que se han introducido correctamente.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  ID  LAST_NAME  FIRST_NAME  USERID  SALARY &lt;br /&gt;
  --  ---------  ----------  ------  ------&lt;br /&gt;
1  1  Patel      Ralph       rpatel     895 &lt;br /&gt;
2  2  Dancs      Betty       bdancs     860&lt;br /&gt;
3  3  Biri       Ben         bbiri     1100  &lt;br /&gt;
4  4  Newman     Chad        cnewman    750&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9) Confirme los cambios en la tabla.&lt;br /&gt;
&lt;br /&gt;
'''Actualice y suprima datos de la tabla MY_EMPLOYEE.'''&lt;br /&gt;
&lt;br /&gt;
10) Cambie el apellido del empleado 3 a Drexler.&lt;br /&gt;
&lt;br /&gt;
11) Cambie el salario a 1.000 dólares para todos los empleados con un salario inferior a 900.&lt;br /&gt;
&lt;br /&gt;
12) Visualiza todos los empleados y compruebe que los cambios se ha realizado correctamente.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  ID  LAST_NAME  FIRST_NAME  USERID  SALARY &lt;br /&gt;
  --  ---------  ----------  ------  ------&lt;br /&gt;
1  1  Patel      Ralph       rpatel    1000 &lt;br /&gt;
2  2  Dancs      Betty       bdancs    1000&lt;br /&gt;
3  3  Drexler    Ben         bbiri     1100  &lt;br /&gt;
4  4  Newman     Chad        cnewman   1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
13) Suprima Betty Dancs de la tabla MY_EMPLOYEE .&lt;br /&gt;
&lt;br /&gt;
14) Visualize todos los empleados y compruebe que los cambios se ha realicado correctamente.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  ID  LAST_NAME  FIRST_NAME  USERID  SALARY &lt;br /&gt;
  --  ---------  ----------  ------  ------&lt;br /&gt;
1  1  Patel      Ralph       rpatel    1000 &lt;br /&gt;
2  3  Drexler    Ben         bbiri     1100  &lt;br /&gt;
3  4  Newman     Chad        cnewman   1000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
15) Confirme todos los cambios pendientes.&lt;br /&gt;
&lt;br /&gt;
'''Controle la transacción de datos a la tabla MY_EMPLOYEE .'''&lt;br /&gt;
&lt;br /&gt;
16) Rellene la tabla con la última fila de datos de ejemplo mostrada en el paso 3 mediante las sentencias del script que ha creado en el paso 6. Ejecute las sentencias en el script.&lt;br /&gt;
&lt;br /&gt;
17) Compruebe que los datos se han introducido correctamente.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  ID  LAST_NAME  FIRST_NAME  USERID  SALARY &lt;br /&gt;
  --  ---------  ----------  ------  ------&lt;br /&gt;
1  1  Patel      Ralph       rpatel    1000 &lt;br /&gt;
2  3  Drexler    Ben         bbiri     1100  &lt;br /&gt;
3  4  Newman     Chad        cnewman   1000&lt;br /&gt;
4  5  Ropeburn   Audrey      aropebur  1550&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
18) Marque un punto intermedio en el procesamiento de la transacción.&lt;br /&gt;
&lt;br /&gt;
19) Suprima todas las filas de la tabla MY_EMPLOYEE .&lt;br /&gt;
&lt;br /&gt;
20) Confirme que la tabla está vacía.&lt;br /&gt;
&lt;br /&gt;
21) Deseche la operación DELETE más reciente sin desechar la operación INSERT anterior.&lt;br /&gt;
&lt;br /&gt;
22) Compruebe que la nueva fila esté intacta.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  ID  LAST_NAME  FIRST_NAME  USERID  SALARY &lt;br /&gt;
  --  ---------  ----------  ------  ------&lt;br /&gt;
1  1  Patel      Ralph       rpatel    1000 &lt;br /&gt;
2  3  Drexler    Ben         bbiri     1100  &lt;br /&gt;
3  4  Newman     Chad        cnewman   1000&lt;br /&gt;
4  5  Ropeburn   Audrey      aropebur  1550&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
23) Confirme los cambios.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Si tiene tiempo, realice el siguiente ejercicio:&lt;br /&gt;
&lt;br /&gt;
24) Modifique el script lab_09_06.sql de forma que USERID se genere automáticamente concatenando la primera letra del primer nombre y de los primeros siete caracteres del apellido. El USERID generado debe estar en minúscula. Por lo tanto, no se debe solicitar el script para el USERID . Guarde este script en un archivo&lt;br /&gt;
denominado lab_09_24.sql .&lt;br /&gt;
&lt;br /&gt;
25) Ejecute el script lab_09_24.sql para insertar el siguiente registro:&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|ID&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|LAST_NAME&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;120 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|FIRST_NAME&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;85 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|USERID&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;85 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|SALARY&lt;br /&gt;
|-&lt;br /&gt;
|6||Anthony||Mark||manthony||1230&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
26) Compruebe que se ha agregado la nueva fila con el USERID correcto.&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|ID&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;100 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|LAST_NAME&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;120 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|FIRST_NAME&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;85 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|USERID&lt;br /&gt;
! align=&amp;quot;left&amp;quot; width=&amp;quot;85 px&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|SALARY&lt;br /&gt;
|-&lt;br /&gt;
|6||Anthony||Mark||manthony||1230&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T7-HR&amp;diff=18590</id>
		<title>M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Exercicis T7-HR</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T7-HR&amp;diff=18590"/>
				<updated>2024-11-20T10:56:01Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1) El departamento de recursos humanos necesita una consulta que solicite al usuario el apellido de un empleado. A continuación, la consulta muestra el apellido y la fecha de contratación de cualquier empleado en el mismo departamento del empleado cuyo nombre se proporciona (excepto ese empleado). Por ejemplo, si el usuario introduce Zlotkey , se buscarán todos los empleados que trabajen con Zlotkey (excepto Zlotkey).&lt;br /&gt;
&lt;br /&gt;
[[Imatge:m2_ET7HR_1.png |300px| Diàleg]]&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  HIRE_DATE&lt;br /&gt;
  ---------  ---------&lt;br /&gt;
1 Russell    01/10/04&lt;br /&gt;
2 Partners   05/01/05&lt;br /&gt;
3 Errazuriz  10/03/05&lt;br /&gt;
4 Cambrault  15/10/07&lt;br /&gt;
5 Tucker     30/01/05&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Cree un informe que muestre el número de empleado, apellido y salario de todos los empleados que ganan más del salario medio. Ordene los resultados en orden ascendente de salario.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPLOYEE_ID  LAST_NAME  SALARY&lt;br /&gt;
  -----------  ---------  ------&lt;br /&gt;
1         203  Mavris	    6500&lt;br /&gt;
2         123  Vollman	    6500&lt;br /&gt;
3         165  Lee	    6800&lt;br /&gt;
4         113  Popp	    6900&lt;br /&gt;
5         155  Tuvault	    7000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) Escriba una consulta que muestre el número de empleado y el apellido de todos los empleados que trabajan en un departamento con un empleado cuyo apellido contiene una &amp;quot;u&amp;quot;. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPLOYEE_ID  LAST_NAME  &lt;br /&gt;
  -----------  ---------&lt;br /&gt;
1         107  Lorentz&lt;br /&gt;
2         106  Pataballa&lt;br /&gt;
3         105  Austin&lt;br /&gt;
4         104  Ernst&lt;br /&gt;
5         103  Hunold&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4) El departamento de recursos humanos necesita un informe que muestre el apellido, número de departamento e ID de cargo de todos los empleados cuyo ID de ubicación de departamento sea 1700.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  LAST_NAME  DEPARTMENT_ID  JOB_ID&lt;br /&gt;
  ---------  -------------  ----------&lt;br /&gt;
1 King	                90  AD_PRES&lt;br /&gt;
2 Kochhar	        90  AD_VP&lt;br /&gt;
3 De Haan	        90  AD_VP&lt;br /&gt;
4 Greenberg	       100  FI_MGR&lt;br /&gt;
5 Faviet	       100  FI_ACCOUNT&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modifique la consulta para que se solicite al usuario un ID de ubicación. &lt;br /&gt;
&lt;br /&gt;
5) Cree un informe para el departamento de recursos humanos que muestre el apellido y el salario de cada empleado que realice informes para Steven King.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  SALARY&lt;br /&gt;
  ---------  ------&lt;br /&gt;
1 Kochhar     17000&lt;br /&gt;
2 De Haan     17000&lt;br /&gt;
3 Raphaely    11000&lt;br /&gt;
4 Weiss	       8000&lt;br /&gt;
5 Fripp	       8200&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6) Cree un informe para el departamento de recursos humanos que muestre el número de departamento, apellido e ID de cargo de cada empleado del departamento Executive.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DEPARTMENT_ID  LAST_NAME  JOB_ID&lt;br /&gt;
  -------------  ---------  -------&lt;br /&gt;
1            90	 King	    AD_PRES&lt;br /&gt;
2            90  Kochhar    AD_VP&lt;br /&gt;
3            90	 De Haan    AD_VP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7) Cree un informe que muestre una lista de todos los empleados cuyo salario sea mayor que el salario de los empleados del departamento 60.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  &lt;br /&gt;
  ---------  &lt;br /&gt;
1 King&lt;br /&gt;
2 Kochhar&lt;br /&gt;
3 De Haan&lt;br /&gt;
4 Russell&lt;br /&gt;
5 Partners&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si tiene tiempo, realice el siguiente ejercicio:&lt;br /&gt;
&lt;br /&gt;
8) Modifique la consulta del apartado 3 para mostrar el número de empleado, apellido y salario de todos los empleados que ganan más del salario medio y que trabajan en un departamento con cualquier empleado cuyo apellido contiene una &amp;quot;u&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPLOYEE_ID  LAST_NAME  SALARY&lt;br /&gt;
  -----------  ---------  ------&lt;br /&gt;
1         103  Hunold	    9000&lt;br /&gt;
2         123  Vollman	    6500&lt;br /&gt;
3         122  Kaufling	    7900&lt;br /&gt;
4         121  Fripp	    8200&lt;br /&gt;
5         120  Weiss	    8000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T6-HR&amp;diff=18452</id>
		<title>M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Exercicis T6-HR</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T6-HR&amp;diff=18452"/>
				<updated>2024-11-06T15:49:12Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''TAULA JOB_GRADES'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE job_grades (&lt;br /&gt;
grade 		CHAR(1),&lt;br /&gt;
lowest_sal 	NUMBER(8,2) NOT NULL,&lt;br /&gt;
highest_sal	NUMBER(8,2) NOT NULL&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE job_grades&lt;br /&gt;
ADD CONSTRAINT jobgrades_grade_pk PRIMARY KEY (grade);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO job_grades VALUES ('A', 1000, 2999);&lt;br /&gt;
INSERT INTO job_grades VALUES ('B', 3000, 5999);&lt;br /&gt;
INSERT INTO job_grades VALUES ('C', 6000, 9999);&lt;br /&gt;
INSERT INTO job_grades VALUES ('D', 10000, 14999);&lt;br /&gt;
INSERT INTO job_grades VALUES ('E', 15000, 24999);&lt;br /&gt;
INSERT INTO job_grades VALUES ('F', 25000, 40000);&lt;br /&gt;
&lt;br /&gt;
COMMIT;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Escriba una consulta para que el departamento de recursos humanos genere las direcciones de todos los departamentos. Utilice las tablas LOCATIONS y COUNTRIES .&lt;br /&gt;
Muestre el ID de ubicación, dirección, ciudad, estado o provincia y país en la salida.&lt;br /&gt;
Utilice NATURAL JOIN para producir los resultados.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LOCATION_ID  STREET_ADDRESS              CITY       STATE_PROVINCE    COUNTRY_NAME&lt;br /&gt;
  -----------  --------------------------  ---------  ----------------  ------------------------&lt;br /&gt;
1        1000  1297 Via Cola di Rie	   Roma	      (null)            Italy&lt;br /&gt;
2        1100  93091 Calle della Testa	   Venice     (null)	        Italy&lt;br /&gt;
3        1200  2017 Shinjuku-ku	           Tokyo      Tokyo Prefecture	Japan&lt;br /&gt;
4        1300  9450 Kamiya-cho	           Hiroshima  (null)            Japan&lt;br /&gt;
5        1400  2014 Jabberwocky Rd	   Southlake  Texas	        United States of America&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) El departamento de recursos humanos necesita un informe de todos los empleados.&lt;br /&gt;
Escriba una consulta para mostrar el apellido, número y nombre de departamento de todos los empleados.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME   DEPARTMENT_ID  DEPARTMENT_NAME&lt;br /&gt;
  ----------  -------------  ---------------&lt;br /&gt;
1 Whalen	         10  Administration&lt;br /&gt;
2 Fay	                 20  Marketing&lt;br /&gt;
3 Hartstein	         20  Marketing&lt;br /&gt;
4 Tobias	         30  Purchasing&lt;br /&gt;
5 Colmenares	         30  Purchasing&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) El departamento de recursos humanos necesita un informe de todos los empleados de Toronto. Muestre el apellido, cargo, número y nombre de departamento de todos los empleados que trabajan en Toronto.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  JOB_ID  DEPARTMENT_ID  DEPARTMENT_NAME&lt;br /&gt;
  ---------  ------  -------------  ---------------&lt;br /&gt;
1 Hartstein  MK_MAN	        20  Marketing&lt;br /&gt;
2 Fay        MK_REP	        20  Marketing&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4) Cree un informe para mostrar el apellido y número de empleado junto con el apellido y número de gestor de sus gestores. Etiquete las columnas como Employee, Emp#, Manager y Mgr#, respectivamente. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Employee  EMP#  Manager    Mgr#&lt;br /&gt;
  --------  ----  ---------  ----&lt;br /&gt;
1 Kumar	     173  Cambrault   148&lt;br /&gt;
2 Bates	     172  Cambrault   148&lt;br /&gt;
3 Smith	     171  Cambrault   148&lt;br /&gt;
4 Fox	     170  Cambrault   148&lt;br /&gt;
5 Bloom	     169  Cambrault   148&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) Modifique la consulta 4) para mostrar todos los empleados, incluido King, que no tienen gestor. Ordene los resultados por número de empleado. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Employee  EMP#  Manager    Mgr#&lt;br /&gt;
  --------  ----  ---------  ------&lt;br /&gt;
1 King	     100  (null)     (null)		&lt;br /&gt;
2 Kochhar    101  King	        100&lt;br /&gt;
3 De Haan    102  King	        100&lt;br /&gt;
4 Hunold     103  De Haan	102&lt;br /&gt;
5 Ernst	     104  Hunold	103&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
6) Cree un informe del departamento de recursos humanos que muestre los compañeros de departamento de cada uno de los empleados. Proporcione a cada columna una etiqueta adecuada.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DEPARTMENT  EMPLOYEE   COLLEAGUE&lt;br /&gt;
  ----------  ---------  ---------&lt;br /&gt;
1         20  Fay        Hartstein&lt;br /&gt;
2         20  Hartstein	 Fay&lt;br /&gt;
3         30  Baida	 Colmenares&lt;br /&gt;
4         30  Baida	 Himuro&lt;br /&gt;
5         30  Baida	 Khoo&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7) El departamento de recursos humanos necesita un informe sobre los salarios y grados de cargo. Para familiarizarse con la tabla JOB_GRADES , en primer lugar, muestre la estructura de la tabla JOB_GRADES . A continuación, cree una consulta que muestre el apellido, cargo, nombre de departamento, salario y grado de todos los empleados.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DESC JOB_GRADES&lt;br /&gt;
Nombre       Nulo      Tipo      &lt;br /&gt;
-----------  --------  --------- &lt;br /&gt;
GRADE_LEVEL  NOT NULL  CHAR(1)   &lt;br /&gt;
LOWEST_SAL             NUMBER(6) &lt;br /&gt;
HIGHEST_SAL            NUMBER(6) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  JOB_ID   DEPARTMENT_NAME  SALARY  GRADE_LEVEL&lt;br /&gt;
  ---------  -------  ---------------  ------  -----------&lt;br /&gt;
1 King	     AD_PRES  Executive	       24000   E&lt;br /&gt;
2 Kochhar    AD_VP    Executive	       17000   E&lt;br /&gt;
3 De Haan    AD_VP    Executive	       17000   E&lt;br /&gt;
4 Russell    SA_MAN   Sales	       14000   D&lt;br /&gt;
5 Partners   SA_MAN   Sales	       13500   D&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si desea superarse a sí mismo, complete los siguientes ejercicios:&lt;br /&gt;
&lt;br /&gt;
8) El departamento de recursos humanos desea determinar los nombres de todos los empleados contratados después de Davies. Cree una consulta para mostrar el nombre y la fecha de contratación de cualquier empleado contratado después del empleado Davies.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  HIRE_DATE&lt;br /&gt;
  ---------  ---------&lt;br /&gt;
1 Kochhar    21/09/05&lt;br /&gt;
2 Hunold     03/01/06&lt;br /&gt;
3 Ernst	     21/05/07&lt;br /&gt;
4 Austin     25/06/05&lt;br /&gt;
5 Pataballa  05/02/06&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9) El departamento de recursos humanos necesita buscar el nombre y la fecha de contratación de todos los empleados contratados antes que sus gestores, junto con el nombre y fecha de contratación del gestor.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  HIRE_DATE  LAST_NAME_1  HIREDATE_1&lt;br /&gt;
  ---------  ---------  -----------  ----------&lt;br /&gt;
1 Kaufling   01/05/03	King	     17/06/03&lt;br /&gt;
2 Raphaely   07/12/02	King	     17/06/03&lt;br /&gt;
3 De Haan    13/01/01	King	     17/06/03&lt;br /&gt;
4 Higgins    07/06/02	Kochhar	     21/09/05&lt;br /&gt;
5 Baer	     07/06/02	Kochhar	     21/09/05&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T5-HR&amp;diff=18390</id>
		<title>M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Exercicis T5-HR</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T5-HR&amp;diff=18390"/>
				<updated>2024-10-16T14:22:37Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Determine la validez de las tres sentencias siguientes. Seleccione Verdadero o Falso.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1) Las funciones de grupo funcionan en varias filas para producir un resultado por grupo.&lt;br /&gt;
&lt;br /&gt;
Verdadero/Falso&lt;br /&gt;
&lt;br /&gt;
2) Las funciones de grupo incluyen valores nulos en los cálculos.&lt;br /&gt;
&lt;br /&gt;
Verdadero/Falso&lt;br /&gt;
&lt;br /&gt;
3) La cláusula WHERE restringe las filas antes de incluirlas en un cálculo de grupo.&lt;br /&gt;
&lt;br /&gt;
Verdadero/Falso&lt;br /&gt;
&lt;br /&gt;
El departamento de recursos humanos necesita los siguientes informes:&lt;br /&gt;
&lt;br /&gt;
4) Encontrar el valor más alto, el valor más bajo, la suma y la media del salario de todos los empleados. Etiquete las columnas como Maximum, Minimum, Sum y Average, respectivamente. Redondee los resultados al número entero más cercano.  Ejecute la consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Maximum  Minimum  Sum     Average&lt;br /&gt;
  -------  -------  ------  -------&lt;br /&gt;
1   24000     2100  691416     6462&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) Modifique la consulta para mostrar el valor mínimo, el valor máximo, la suma y la media del salario de cada tipo de cargo. Ejecute la sentencia.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  JOB_ID      Maximum  Minimum  Sum     Average&lt;br /&gt;
  ----------  -------  -------  ------  -------&lt;br /&gt;
1 IT_PROG        9000	  4200   28800     5760&lt;br /&gt;
2 AC_MGR        12008	 12008   12008    12008&lt;br /&gt;
3 AC_ACCOUNT	 8300	  8300    8300     8300&lt;br /&gt;
4 ST_MAN	 8200	  5800   36400     7280&lt;br /&gt;
5 PU_MAN	11000	 11000   11000    11000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6) Escriba una consulta para mostrar el número de personas con el mismo cargo.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  JOB_ID      COUNT(*)&lt;br /&gt;
  ----------  -------- &lt;br /&gt;
1 AC_ACCOUNT	     1&lt;br /&gt;
2 AC_MGR	     1&lt;br /&gt;
3 AD_ASST	     1&lt;br /&gt;
4 AD_PRES	     1&lt;br /&gt;
5 AD_VP	             2&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generalice la consulta para preguntar al usuario del departamento de recursos humanos cuál es su puesto. Ejecute la consulta. Introduzca IT_PROG cuando se le solicite y haga clic en OK.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  JOB_ID   COUNT(*)&lt;br /&gt;
  -------  --------&lt;br /&gt;
1 IT_PROG         5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7) Determine el número de gestores sin enumerarlos en una lista. Etiquete la columna como Number of Managers.&lt;br /&gt;
&lt;br /&gt;
'''Indicación:''' utilice la columna MANAGER_ID para determinar el número de gestores.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Number of Managers&lt;br /&gt;
  ------------------ &lt;br /&gt;
1                 18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8) Busque la diferencia entre los salarios más altos y más bajos. Etiquete la columna como DIFFERENCE.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  DIFFERENCE&lt;br /&gt;
  ----------&lt;br /&gt;
1      21900&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si tiene tiempo, realice los siguientes ejercicios:&lt;br /&gt;
&lt;br /&gt;
9) Cree un informe para mostrar el número de gestor y el salario del empleado con menor sueldo de ese gestor. Excluya a cualquier trabajador del que desconozca su gestor. Excluya cualquier grupo en el que el salario mínimo sea 6.000 dólares o menos. Ordene la salida en orden descendente de salarios.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  MANAGER_ID  MIN(salary)&lt;br /&gt;
  ----------  -----------&lt;br /&gt;
1        102	     9000&lt;br /&gt;
2        205	     8300&lt;br /&gt;
3        145         7000&lt;br /&gt;
4        146         7000&lt;br /&gt;
5        108	     6900&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si desea superarse a sí mismo, complete los siguientes ejercicios:&lt;br /&gt;
&lt;br /&gt;
10) Cree una consulta que muestre el número total de empleados y, de ese total, el número de empleados contratados en 2005, 2006, 2007 y 2008. Cree las cabeceras de columna adecuadas.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  TOTAL  2005  2006  2007  2008&lt;br /&gt;
  -----  ----  ----  ----  ----&lt;br /&gt;
1   107	   29	 24    19    11&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11) Cree una consulta de matriz para mostrar el cargo, el salario de ese cargo según el número de departamento y el salario total del cargo para los departamentos 20, 50, 80 y 90, proporcionando a cada columna una cabecera adecuada.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Job         Dept 20  Dept 50  Dept 80  Dept 90  Total&lt;br /&gt;
  ----------  -------  -------  -------  -------  -----&lt;br /&gt;
1 IT_PROG      (null)   (null)	 (null)   (null)  28800&lt;br /&gt;
2 AC_MGR       (null)   (null)	 (null)   (null)  12008&lt;br /&gt;
3 AC_ACCOUNT   (null)   (null)	 (null)   (null)   8300&lt;br /&gt;
4 ST_MAN       (null)    36400	 (null)   (null)  36400&lt;br /&gt;
5 PU_MAN       (null)   (null)	 (null)   (null)  11000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T3-HR&amp;diff=18274</id>
		<title>M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Exercicis T3-HR</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T3-HR&amp;diff=18274"/>
				<updated>2024-10-07T12:09:01Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1) Escriba una consulta para mostrar la fecha del sistema. Etiquete la columna como Date.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' si la base de datos se ubica de forma remota en una zona horaria diferente, la salida será la fecha del sistema operativo en el que reside la base de datos.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Date&lt;br /&gt;
  ----&lt;br /&gt;
1 08/12/17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) El departamento de recursos humanos necesita un informe que muestre el número de empleado, apellido, salario y salario aumentado en un 15,5% (expresado como número entero) para cada empleado. Etiquete la columna como New Salary.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3) Ejecute la consulta del apartado 2.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPLOYEE_ID  LAST_NAME  SALARY  New Salary&lt;br /&gt;
  -----------  ---------  ------  ----------&lt;br /&gt;
1         100  King	   24000       27720&lt;br /&gt;
2         101  Kochhar	   17000       19635&lt;br /&gt;
3         102  De Haan	   17000       19635&lt;br /&gt;
4         103  Hunold	    9000       10395&lt;br /&gt;
5         104  Ernst	    6000        6930&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4) Modifique la consulta del apartado 2 para agregar una columna que reste el salario antiguo del nuevo. Etiquete la columna como Increase. Ejecute la consulta revisada.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPLOYEE_ID  LAST_NAME  SALARY  New Salary  Increase&lt;br /&gt;
  -----------  ---------  ------  ----------  --------&lt;br /&gt;
1         100  King	   24000       27720      3720&lt;br /&gt;
2         101  Kochhar	   17000       19635      2635&lt;br /&gt;
3         102  De Haan	   17000       19635      2635&lt;br /&gt;
4         103  Hunold	    9000       10395      1395&lt;br /&gt;
5         104  Ernst	    6000        6930       930&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) Escriba una consulta que muestre el apellido (con la primera letra en mayúsculas y el resto en minúsculas) y la longitud del apellido de todos los empleados cuyos nombres empiecen por las letras &amp;quot;J&amp;quot;, &amp;quot;A&amp;quot; o &amp;quot;M&amp;quot;. Proporcione a cada columna una etiqueta adecuada. Ordene los resultados por el apellido de los empleados.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Name      Length&lt;br /&gt;
  --------  ------&lt;br /&gt;
1 Abel	         4&lt;br /&gt;
2 Ande	         4&lt;br /&gt;
3 Atkinson	 8&lt;br /&gt;
4 Austin	 6&lt;br /&gt;
5 Johnson	 7&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vuelva a escribir la consulta para que se le solicite al usuario que introduzca la letra por la que empieza el apellido. Por ejemplo, si el usuario introduce H (en mayúscula) cuando se le solicita que introduzca una letra, la salida debe mostrar a todos los empleados cuyos apellidos empiecen por la letra &amp;quot;H&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Name      Length&lt;br /&gt;
  --------  ------&lt;br /&gt;
1 Hall	         4&lt;br /&gt;
2 Hartstein	 9&lt;br /&gt;
3 Higgins	 7&lt;br /&gt;
4 Himuro	 6&lt;br /&gt;
5 Hunold	 6&lt;br /&gt;
6 Hutton	 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modifique la consulta de forma que la mayúscula/minúscula de la letra introducida no afecte a la salida. La letra introducida debe estar en mayúscula antes de que la procese la consulta SELECT.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:m2_T3EHR_5.png |300px| Diàleg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Name      Length&lt;br /&gt;
  --------  ------&lt;br /&gt;
1 Hall	         4&lt;br /&gt;
2 Hartstein	 9&lt;br /&gt;
3 Higgins	 7&lt;br /&gt;
4 Himuro	 6&lt;br /&gt;
5 Hunold	 6&lt;br /&gt;
6 Hutton	 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6) El departamento de recursos humanos desea buscar la duración del contrato de cada empleado. Para cada empleado, muestre el apellido y calcule el número de meses entre el día de hoy y la fecha de contratación del empleado. Etiquete la columna como MONTHS_WORKED. Ordene los resultados por el número de meses durante los que ha trabajado. Redondee el número de meses hasta el número entero más cercano.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' debido a que esta consulta depende de la fecha de ejecución, los valores de la&lt;br /&gt;
columna MONTHS_WORKED serán diferentes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  MONTHS_WORKED&lt;br /&gt;
  ---------  -------------&lt;br /&gt;
1 Ande	               116&lt;br /&gt;
2 Banda	               116&lt;br /&gt;
3 Kumar	               116&lt;br /&gt;
4 Markle	       117&lt;br /&gt;
5 Philtanker	       118&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si tiene tiempo, realice los siguientes ejercicios:&lt;br /&gt;
&lt;br /&gt;
7) Cree una consulta para mostrar el apellido y el salario de todos los empleados.&lt;br /&gt;
Formatee el salario para que tenga 15 caracteres de longitud y tenga un relleno hacia la izquierda con el símbolo $. Etiquete la columna como SALARY.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  SALARY&lt;br /&gt;
  ---------  ---------------&lt;br /&gt;
1 King	     $$$$$$$$$$24000&lt;br /&gt;
2 Kochhar    $$$$$$$$$$17000&lt;br /&gt;
3 De Haan    $$$$$$$$$$17000&lt;br /&gt;
4 Hunold     $$$$$$$$$$$9000&lt;br /&gt;
5 Ernst	     $$$$$$$$$$$6000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8) Cree una consulta que muestre los primeros ocho caracteres de los apellidos de los empleados y que indique las cantidades de sus salarios con asteriscos. Cada asterisco significa mil dólares. Ordene los datos en orden descendente de salarios. Etiquete la columna EMPLOYEES_AND_THEIR_SALARIES.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPLOYEES_AND_THEIR_SALARIES&lt;br /&gt;
  ----------------------------------&lt;br /&gt;
1 King      ************************&lt;br /&gt;
2 Kochhar   *****************&lt;br /&gt;
3 De Haan   *****************&lt;br /&gt;
4 Russell   **************&lt;br /&gt;
5 Partners  *************&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9) Cree una consulta para mostrar el apellido y el número de semanas durante las que han trabajado todos los empleados del departamento 90. Etiquete la columna de número de semanas como TENURE. Trunque el valor del número de semana en 0 decimales. Muestre los registros en orden descendente de antigüedad del empleado.&lt;br /&gt;
&lt;br /&gt;
'''Nota:''' el valor TENURE variará ya que depende de la fecha de ejecución de la consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  TENURE&lt;br /&gt;
  ---------  ------&lt;br /&gt;
1 De Haan	881&lt;br /&gt;
2 King	        755&lt;br /&gt;
3 Kochhar	637&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T2-HR&amp;diff=18273</id>
		<title>M2 - Bases de dades / Exercicis UF2: Llenguatges SQL / Exercicis T2-HR</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=M2_-_Bases_de_dades_/_Exercicis_UF2:_Llenguatges_SQL_/_Exercicis_T2-HR&amp;diff=18273"/>
				<updated>2024-10-07T12:05:44Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;El departamento de recursos humanos necesita su ayuda para crear algunas consultas.&lt;br /&gt;
&lt;br /&gt;
1) Debido a problemas presupuestarios, el departamento de recursos humanos necesita un informe que muestre el apellido y el salario de los empleados que ganan más de 12.000 dólares. Ejecute la consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  SALARY&lt;br /&gt;
  ---------  ------&lt;br /&gt;
1 King	      24000&lt;br /&gt;
2 Kochhar     17000&lt;br /&gt;
3 De Haan     17000&lt;br /&gt;
4 Greenberg   12008&lt;br /&gt;
5 Russell     14000&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2) Cree una nueva consulta que muestre el apellido y el número de departamento para el número de empleado 176.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  DEPARTAMENT_ID&lt;br /&gt;
  ---------  --------------&lt;br /&gt;
1 Taylor	         80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3) El departamento de recursos humanos necesita encontrar los empleados con salarios tanto altos como bajos. Realice una consulta para mostrar el apellido y el salario de todos los empleados cuyo salario no esté entre 5.000 y 12.000 dólares.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  SALARY&lt;br /&gt;
  ---------  ------&lt;br /&gt;
1 King	      24000&lt;br /&gt;
2 Kochhar     17000&lt;br /&gt;
3 De Haan     17000&lt;br /&gt;
4 Austin       4800&lt;br /&gt;
5 Pataballa    4800&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4) Cree un informe para mostrar el apellido, ID de cargo y fecha de contratación de los empleados cuyos apellidos sean Matos y Taylor. Ordene la consulta en orden ascendente por fecha de contratación.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  JOB_ID    HIRE_DATE&lt;br /&gt;
  ---------  --------  ---------&lt;br /&gt;
1 Taylor     SH_CLERK  24/01/06&lt;br /&gt;
2 Matos      ST_CLERK  15/03/06&lt;br /&gt;
3 Taylor     SA_REP    24/03/06&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
5) Muestre el apellido y el ID de departamento de todos los empleados de los departamentos 20 o 50 en orden alfabético ascendente por apellido.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  DEPARTAMENT_ID&lt;br /&gt;
  ---------  --------------&lt;br /&gt;
1 Atkinson	         50&lt;br /&gt;
2 Bell	                 50&lt;br /&gt;
3 Bissot                 50&lt;br /&gt;
4 Bull	                 50&lt;br /&gt;
5 Cabrio	         50&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
6) Modifique la consulta del apartado 3 para mostrar el apellido y el salario de los empleados que ganan entre 5.000 y 12.000 dólares y están en el departamento 20 o 50. Etiquete las columnas Employee y Monthly Salary, respectivamente. Ejecute la consulta.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Employee  Monthly Salary&lt;br /&gt;
  --------  --------------&lt;br /&gt;
1 Weiss	              8000&lt;br /&gt;
2 Fripp               8200&lt;br /&gt;
3 Kaufling	      7900&lt;br /&gt;
4 Vollman	      6500&lt;br /&gt;
5 Mourgos	      5800&lt;br /&gt;
6 Fay	              6000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
7) El departamento de recursos humanos necesita un informe que muestre el apellido y la fecha de contratación de todos los empleados contratados durante el año 2004.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  HIRE_DATE&lt;br /&gt;
  ---------  ---------&lt;br /&gt;
1 Weiss	     18/07/04&lt;br /&gt;
2 Mallin     14/06/04&lt;br /&gt;
3 Russell    01/10/04&lt;br /&gt;
4 King	     30/01/04&lt;br /&gt;
5 Sully	     04/03/04&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
8) Cree un informe para mostrar el apellido y el puesto de todos los empleados que no tienen un supervisor.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  JOB_ID    &lt;br /&gt;
  ---------  -------&lt;br /&gt;
1 King	     AD_PRES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9) Cree un informe para mostrar el apellido, salario y comisión de todos los empleados que perciben comisiones. Ordene los datos en orden descendente de salario y comisiones (primero por salario y en caso de salarios iguales, por comisión). Utilice la posición numérica de la columna en la cláusula ORDER BY .&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  SALARY  COMMISSION_PCT&lt;br /&gt;
  ---------  ------  --------------&lt;br /&gt;
1 Russell     14000	        0,4&lt;br /&gt;
2 Partners    13500	        0,3&lt;br /&gt;
3 Errazuriz   12000	        0,3&lt;br /&gt;
4 Ozer	      11500	       0,25&lt;br /&gt;
5 Cambrault   11000	        0,3&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10) Los miembros del departamento de recursos humanos desean tener más flexibilidad con las consultas que está creando. Les gustaría tener un informe que muestre el apellido y el salario de los empleados que ganen más de una cantidad especificada por el usuario después de una solicitud. (Puede utilizar la consulta creada en el ejercicio práctico 1 y modificarla). &lt;br /&gt;
&lt;br /&gt;
Introduzca 12000 cuando se le solicite un valor en un cuadro de diálogo. Haga clic en OK.&lt;br /&gt;
&lt;br /&gt;
[[Imatge:m2_T2HR_10.png |300px| Diàleg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME  SALARY&lt;br /&gt;
  ---------  ------&lt;br /&gt;
1 King	      24000&lt;br /&gt;
2 Kochhar     17000&lt;br /&gt;
3 De Haan     17000&lt;br /&gt;
4 Greenberg   12008&lt;br /&gt;
5 Russell     14000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
11) El departamento de recursos humanos desea ejecutar informes basados en un supervisor. Cree una consulta que solicite al usuario un ID de supervisor y genere el ID de empleado, apellido, salario y departamento de los empleados de ese supervisor. El departamento de recursos humanos desea ordenar el informe en una columna seleccionada. Puede probar los datos con los siguientes valores:&lt;br /&gt;
&lt;br /&gt;
:manager _id = 103, ordenado por last_name&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPLOYEE_ID  LAST_NAME  SALARY  DEPARTMENT_ID&lt;br /&gt;
  -----------  ---------  ------  -------------&lt;br /&gt;
1         105  Austin	    4800	     60&lt;br /&gt;
2         104  Ernst	    6000	     60&lt;br /&gt;
3         107  Lorentz	    4200	     60&lt;br /&gt;
4         106  Pataballa    4800	     60&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:manager_id = 108, ordenado por salary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPLOYEE_ID  LAST_NAME  SALARY  DEPARTMENT_ID&lt;br /&gt;
  -----------  ---------  ------  -------------&lt;br /&gt;
1         113  Popp	    6900	    100&lt;br /&gt;
2         111  Sciarra	    7700	    100&lt;br /&gt;
3         112  Urman	    7800	    100&lt;br /&gt;
4         110  Chen	    8200	    100&lt;br /&gt;
5         109  Faviet	    9000	    100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:manager_id = 124, ordenado por employee_id&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  EMPLOYEE_ID  LAST_NAME  SALARY  DEPARTMENT_ID&lt;br /&gt;
  -----------  ---------  ------  -------------&lt;br /&gt;
1         141  Rajs	    3500	     50&lt;br /&gt;
2         142  Davies	    3100	     50&lt;br /&gt;
3         143  Matos	    2600	     50&lt;br /&gt;
4         144  Vargas	    2500	     50&lt;br /&gt;
5         196  Walsh	    3100	     50&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si tiene tiempo, realice los siguientes ejercicios:&lt;br /&gt;
&lt;br /&gt;
12) Muestre todos los apellidos de los empleados cuya tercera letra sea una &amp;quot;a&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME&lt;br /&gt;
  ---------&lt;br /&gt;
1 Grant&lt;br /&gt;
2 Grant&lt;br /&gt;
3 Whalen&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
13) Muestre los apellidos de los empleados que tengan una &amp;quot;a&amp;quot; y una &amp;quot;e&amp;quot; en su apellido.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME&lt;br /&gt;
  ---------&lt;br /&gt;
1 Baer&lt;br /&gt;
2 Bates&lt;br /&gt;
3 Colmenares&lt;br /&gt;
4 Davies&lt;br /&gt;
5 De Haan&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si desea superarse a sí mismo, complete los siguientes ejercicios:&lt;br /&gt;
&lt;br /&gt;
14) Muestre el apellido, cargo y salario de todos los empleados que sean vendedores u oficinistas (SA_REP o ST_CLERK) y cuyo salario no sea igual que 2.500, 3.500 o 7.000 dólares.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  LAST_NAME    JOB_ID    SALALRY&lt;br /&gt;
  ---------    --------  -------&lt;br /&gt;
1 Nayer	       ST_CLERK	    3200&lt;br /&gt;
2 Mikkilineni  ST_CLERK	    2700&lt;br /&gt;
3 Landry       ST_CLERK	    2400&lt;br /&gt;
4 Markle       ST_CLERK	    2200&lt;br /&gt;
5 Bissot       ST_CLERK	    3300&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
15) Modifique la consulta del apartado 6 para mostrar el apellido, salario y comisión de todos los empleados cuya comisión sea del 20%. Ejecute la sentencia.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Employee  Monthly Salary  COMMISSION_PCT&lt;br /&gt;
  --------  --------------  --------------&lt;br /&gt;
1 Zlotkey	     10500	       0,2&lt;br /&gt;
2 Olsen	              8000	       0,2&lt;br /&gt;
3 Cambrault	      7500	       0,2&lt;br /&gt;
4 Bloom	             10000	       0,2&lt;br /&gt;
5 Fox	              9600	       0,2&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18269</id>
		<title>MPO - Raponament lògic / AEA1A1: Solucions exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18269"/>
				<updated>2024-10-07T08:46:57Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Exercici 1===&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra! &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3  &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents preposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; q'''&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬(p &amp;amp;#94; q)'''&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
::p = m'agrada dormir&lt;br /&gt;
::q = m'agrada matinar&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
::p = tu estàs equivocat&lt;br /&gt;
::q = la notícia que has llegit és falsa&lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
::p = estàs boja&lt;br /&gt;
::q = has vingut aquí&lt;br /&gt;
&lt;br /&gt;
::'''¬p → ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; (q ˅ r)'''&lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''(p &amp;amp;#94; q) ˅ r'''&lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::p = hi ha verdadera democracia&lt;br /&gt;
::q = hi ha detencions arbitràrie&lt;br /&gt;
::r = hi hi violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::'''p → (¬q &amp;amp;#94; ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::p = Robert farà el doctorat&lt;br /&gt;
::q = Robert obtindrà la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::p = ve en tren&lt;br /&gt;
::q = ve en cotxe&lt;br /&gt;
::r = arribarà abans de les sis&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → r'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::'''p → q, r → q |- (p ˅ r) → q'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q: &lt;br /&gt;
&lt;br /&gt;
::'''p → q'''&lt;br /&gt;
&lt;br /&gt;
:*No es el caso que p y q:&lt;br /&gt;
&lt;br /&gt;
::'''¬(p ˄ q)'''&lt;br /&gt;
&lt;br /&gt;
:*p solamente si q y no-r: &lt;br /&gt;
&lt;br /&gt;
::'''p ↔ (q ˄ ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:*p o no-q: &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ ¬q'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces no-r o s: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → (¬r ˅ s)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q, y si q, entonces p: &lt;br /&gt;
&lt;br /&gt;
::'''(p → q) ˄ (q → p)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. p. Luego si q, entonces r: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, p |- q → r'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t:&lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, (r ˄ s) → t |- (p ˄ q ˄ s) → t'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
&lt;br /&gt;
::'''¬(¬p)'''&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
::q: me gusta leer libros de ciencia ficción&lt;br /&gt;
&lt;br /&gt;
::'''p ˄ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
::p: los gatos de mi hermana sueltan pelo&lt;br /&gt;
::q: me gusta acariciar los gatos&lt;br /&gt;
&lt;br /&gt;
::'''¬p → q'''&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
::p: ver un marciano con mis propios ojos&lt;br /&gt;
::q: creer en los extraterrestres&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
::p: salir a dar un paseo&lt;br /&gt;
::q: estudiar como un energúmeno &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico.&lt;br /&gt;
&lt;br /&gt;
::p: los elefantes vuelan &lt;br /&gt;
::q: los elefantes tocan el acordeón&lt;br /&gt;
::r: estar loco&lt;br /&gt;
::s: internar en un psiquiátrico&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → (r ˄ s)''' &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
::p: ir de vacaciones&lt;br /&gt;
::q: no hacer nada &lt;br /&gt;
::r: tener tiempo&lt;br /&gt;
::s: ir a trabajar&lt;br /&gt;
&lt;br /&gt;
::'''(r ˄ ¬s) → (p ˅ q)'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
Enllaça cada proposició amb la seva formalització:&lt;br /&gt;
&lt;br /&gt;
::p: plou&lt;br /&gt;
::q: fa sol&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1||Llueve y hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;5A&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ p ||A&lt;br /&gt;
|-&lt;br /&gt;
| 2||Llueve y no hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;3B&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||p ∨ q||B&lt;br /&gt;
|-&lt;br /&gt;
| 3||Llueve o hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;1C&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||p ∧ q ||C&lt;br /&gt;
|-&lt;br /&gt;
| 4||Si no llueve, hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;2D&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||p ∧¬ q||D&lt;br /&gt;
|-&lt;br /&gt;
| 5||No es cierto que llueva ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;6E&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ ¬ p ||E&lt;br /&gt;
|-&lt;br /&gt;
| 6||No es cierto que no llueva ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;7F&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||q ↔ ¬ p ||F&lt;br /&gt;
|-&lt;br /&gt;
| 7||Hará sol si y sólo si no llueve||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;4G&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ p → q ||G&lt;br /&gt;
|}&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18268</id>
		<title>MPO - Raponament lògic / AEA1A1: Solucions exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18268"/>
				<updated>2024-10-07T08:46:32Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Exercici 1===&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra! &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3  &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents preposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; q'''&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬(p &amp;amp;#94; q)'''&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
::p = m'agrada dormir&lt;br /&gt;
::q = m'agrada matinar&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
::p = tu estàs equivocat&lt;br /&gt;
::q = la notícia que has llegit és falsa&lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
::p = estàs boja&lt;br /&gt;
::q = has vingut aquí&lt;br /&gt;
&lt;br /&gt;
::'''¬p → ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; (q ˅ r)'''&lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''(p &amp;amp;#94; q) ˅ r'''&lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::p = hi ha verdadera democracia&lt;br /&gt;
::q = hi ha detencions arbitràrie&lt;br /&gt;
::r = hi hi violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::'''p → (¬q &amp;amp;#94; ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::p = Robert farà el doctorat&lt;br /&gt;
::q = Robert obtindrà la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::p = ve en tren&lt;br /&gt;
::q = ve en cotxe&lt;br /&gt;
::r = arribarà abans de les sis&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → r'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::'''p → q, r → q |- (p ˅ r) → q'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q: &lt;br /&gt;
&lt;br /&gt;
::'''p → q'''&lt;br /&gt;
&lt;br /&gt;
:*No es el caso que p y q:&lt;br /&gt;
&lt;br /&gt;
::'''¬(p ˄ q)'''&lt;br /&gt;
&lt;br /&gt;
:*p solamente si q y no-r: &lt;br /&gt;
&lt;br /&gt;
::'''p ↔ (q ˄ ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:*p o no-q: &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ ¬q'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces no-r o s: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → (¬r ˅ s)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q, y si q, entonces p: &lt;br /&gt;
&lt;br /&gt;
::'''(p → q) ˄ (q → p)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. p. Luego si q, entonces r: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, p |- q → r'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t:&lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, (r ˄ s) → t |- (p ˄ q ˄ s) → t'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
&lt;br /&gt;
::'''¬(¬p)'''&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
::q: me gusta leer libros de ciencia ficción&lt;br /&gt;
&lt;br /&gt;
::'''p ˄ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
::p: los gatos de mi hermana sueltan pelo&lt;br /&gt;
::q: me gusta acariciar los gatos&lt;br /&gt;
&lt;br /&gt;
::'''¬p → q'''&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
::p: ver un marciano con mis propios ojos&lt;br /&gt;
::q: creer en los extraterrestres&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
::p: salir a dar un paseo&lt;br /&gt;
::q: estudiar como un energúmeno &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico.&lt;br /&gt;
&lt;br /&gt;
::p: los elefantes vuelan &lt;br /&gt;
::q: los elefantes tocan el acordeón&lt;br /&gt;
::r: estar loco&lt;br /&gt;
::s: internar en un psiquiátrico&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → (r ˄ s)''' &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
::p: ir de vacaciones&lt;br /&gt;
::q: no hacer nada &lt;br /&gt;
::r: tener tiempo&lt;br /&gt;
::s: ir a trabajar&lt;br /&gt;
&lt;br /&gt;
::'''(r ˄ ¬s) → (p ˅ q)'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
Enllaça cada proposició amb la seva formalització:&lt;br /&gt;
&lt;br /&gt;
::p: plou&lt;br /&gt;
::q: fa sol&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1||Llueve y hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;5A&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ p ||A&lt;br /&gt;
|-&lt;br /&gt;
| 2||Llueve y no hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;3B&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||p ∨ q||B&lt;br /&gt;
|-&lt;br /&gt;
| 3||Llueve o hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;1C&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||p ∧ q ||C&lt;br /&gt;
|-&lt;br /&gt;
| 4||Si no llueve, hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;2D&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||p ∧¬ q||D&lt;br /&gt;
|-&lt;br /&gt;
| 5||No es cierto que llueva ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;6E&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ ¬ p ||E&lt;br /&gt;
|-&lt;br /&gt;
| 6||No es cierto que no llueva ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;7F&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||q ↔ ¬ p ||F&lt;br /&gt;
|-&lt;br /&gt;
| 7||Hará sol si y sólo si no llueve||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;4G&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ p → q ||G&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18267</id>
		<title>MPO - Raponament lògic / AEA1A1: Solucions exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18267"/>
				<updated>2024-10-07T08:45:34Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Exercici 1===&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra! &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3  &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents preposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; q'''&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬(p &amp;amp;#94; q)'''&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
::p = m'agrada dormir&lt;br /&gt;
::q = m'agrada matinar&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
::p = tu estàs equivocat&lt;br /&gt;
::q = la notícia que has llegit és falsa&lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
::p = estàs boja&lt;br /&gt;
::q = has vingut aquí&lt;br /&gt;
&lt;br /&gt;
::'''¬p → ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; (q ˅ r)'''&lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''(p &amp;amp;#94; q) ˅ r'''&lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::p = hi ha verdadera democracia&lt;br /&gt;
::q = hi ha detencions arbitràrie&lt;br /&gt;
::r = hi hi violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::'''p → (¬q &amp;amp;#94; ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::p = Robert farà el doctorat&lt;br /&gt;
::q = Robert obtindrà la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::p = ve en tren&lt;br /&gt;
::q = ve en cotxe&lt;br /&gt;
::r = arribarà abans de les sis&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → r'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::'''p → q, r → q |- (p ˅ r) → q'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q: &lt;br /&gt;
&lt;br /&gt;
::'''p → q'''&lt;br /&gt;
&lt;br /&gt;
:*No es el caso que p y q:&lt;br /&gt;
&lt;br /&gt;
::'''¬(p ˄ q)'''&lt;br /&gt;
&lt;br /&gt;
:*p solamente si q y no-r: &lt;br /&gt;
&lt;br /&gt;
::'''p ↔ (q ˄ ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:*p o no-q: &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ ¬q'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces no-r o s: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → (¬r ˅ s)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q, y si q, entonces p: &lt;br /&gt;
&lt;br /&gt;
::'''(p → q) ˄ (q → p)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. p. Luego si q, entonces r: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, p |- q → r'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t:&lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, (r ˄ s) → t |- (p ˄ q ˄ s) → t'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
&lt;br /&gt;
::'''¬(¬p)'''&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
::q: me gusta leer libros de ciencia ficción&lt;br /&gt;
&lt;br /&gt;
::'''p ˄ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
::p: los gatos de mi hermana sueltan pelo&lt;br /&gt;
::q: me gusta acariciar los gatos&lt;br /&gt;
&lt;br /&gt;
::'''¬p → q'''&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
::p: ver un marciano con mis propios ojos&lt;br /&gt;
::q: creer en los extraterrestres&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
::p: salir a dar un paseo&lt;br /&gt;
::q: estudiar como un energúmeno &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico.&lt;br /&gt;
&lt;br /&gt;
::p: los elefantes vuelan &lt;br /&gt;
::q: los elefantes tocan el acordeón&lt;br /&gt;
::r: estar loco&lt;br /&gt;
::s: internar en un psiquiátrico&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → (r ˄ s)''' &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
::p: ir de vacaciones&lt;br /&gt;
::q: no hacer nada &lt;br /&gt;
::r: tener tiempo&lt;br /&gt;
::s: ir a trabajar&lt;br /&gt;
&lt;br /&gt;
::'''(r ˄ ¬s) → (p ˅ q)'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
Enllaça cada proposició amb la seva formalització:&lt;br /&gt;
&lt;br /&gt;
::p: plou&lt;br /&gt;
::q: fa sol&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1||Llueve y hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;5A;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ p ||A&lt;br /&gt;
|-&lt;br /&gt;
| 2||Llueve y no hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;3B;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||p ∨ q||B&lt;br /&gt;
|-&lt;br /&gt;
| 3||Llueve o hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;1C;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||p ∧ q ||C&lt;br /&gt;
|-&lt;br /&gt;
| 4||Si no llueve, hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;2D;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||p ∧¬ q||D&lt;br /&gt;
|-&lt;br /&gt;
| 5||No es cierto que llueva ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;6E;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ ¬ p ||E&lt;br /&gt;
|-&lt;br /&gt;
| 6||No es cierto que no llueva ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;7F;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||q ↔ ¬ p ||F&lt;br /&gt;
|-&lt;br /&gt;
| 7||No es cierto que no llueva||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;4G;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ p → q ||G&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18266</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18266"/>
				<updated>2024-10-07T08:42:37Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
Enllaça cada proposició amb la seva formalització:&lt;br /&gt;
&lt;br /&gt;
::p: plou&lt;br /&gt;
::q: fa sol&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1||Llueve y hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ p ||A&lt;br /&gt;
|-&lt;br /&gt;
| 2||Llueve y no hace sol ||||p ∨ q||B&lt;br /&gt;
|-&lt;br /&gt;
| 3||Llueve o hace sol || ||p ∧ q ||C&lt;br /&gt;
|-&lt;br /&gt;
| 4||Si no llueve, hace sol || ||p ∧¬ q||D&lt;br /&gt;
|-&lt;br /&gt;
| 5||No es cierto que llueva || ||¬ ¬ p ||E&lt;br /&gt;
|-&lt;br /&gt;
| 6||No es cierto que no llueva || ||q ↔ ¬ p ||F&lt;br /&gt;
|-&lt;br /&gt;
| 7||No es cierto que no llueva|| ||¬ p → q ||G&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18265</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18265"/>
				<updated>2024-10-07T08:42:19Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
Enllaça cada proposició amb la seva formalització:&lt;br /&gt;
&lt;br /&gt;
::p: plou&lt;br /&gt;
::q: fa sol&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1||Llueve y hace sol ||&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||¬ p ||A&lt;br /&gt;
|-&lt;br /&gt;
| 2||Llueve y no hace sol ||||p ∨ q||B&lt;br /&gt;
|-&lt;br /&gt;
| 3||Llueve o hace sol || ||p ∧ q ||C&lt;br /&gt;
|-&lt;br /&gt;
| 4||Si no llueve, hace sol || ||p ∧¬ q||D&lt;br /&gt;
|-&lt;br /&gt;
| 5||No es cierto que llueva || ||¬ ¬ p ||E&lt;br /&gt;
|-&lt;br /&gt;
| 6||No es cierto que no llueva || ||q ↔ ¬ p ||F&lt;br /&gt;
|-&lt;br /&gt;
| 7||No es cierto que no llueva|| ||¬ p → q ||G&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18264</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18264"/>
				<updated>2024-10-07T08:40:21Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
Enllaça cada proposició amb la seva formalització:&lt;br /&gt;
&lt;br /&gt;
::p: plou&lt;br /&gt;
::q: fa sol&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1||Llueve y hace sol || ||¬ p ||A&lt;br /&gt;
|-&lt;br /&gt;
| 2||Llueve y no hace sol ||||p ∨ q||B&lt;br /&gt;
|-&lt;br /&gt;
| 3||Llueve o hace sol || ||p ∧ q ||C&lt;br /&gt;
|-&lt;br /&gt;
| 4||Si no llueve, hace sol || ||p ∧¬ q||D&lt;br /&gt;
|-&lt;br /&gt;
| 5||No es cierto que llueva || ||¬ ¬ p ||E&lt;br /&gt;
|-&lt;br /&gt;
| 6||No es cierto que no llueva || ||q ↔ ¬ p ||F&lt;br /&gt;
|-&lt;br /&gt;
| 7||No es cierto que no llueva|| ||¬ p → q ||G&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18263</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18263"/>
				<updated>2024-10-07T08:39:42Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
Enllaça cada proposició amb la seva formalització:&lt;br /&gt;
&lt;br /&gt;
::p: plou&lt;br /&gt;
::q: fa sol&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1||Llueve y hace sol || ||¬ p ||A&lt;br /&gt;
|-&lt;br /&gt;
| 2||Llueve y no hace sol ||p ∨ q||p ∨ q||B&lt;br /&gt;
|-&lt;br /&gt;
| 3||Llueve o hace sol || ||p ∧ q ||C&lt;br /&gt;
|-&lt;br /&gt;
| 4||Si no llueve, hace sol || ||p ∧¬ q||D&lt;br /&gt;
|-&lt;br /&gt;
| 5||No es cierto que llueva || ||¬ ¬ p ||E&lt;br /&gt;
|-&lt;br /&gt;
| 6||No es cierto que no llueva || ||q ↔ ¬ p ||F&lt;br /&gt;
|-&lt;br /&gt;
| 7||No es cierto que no llueva|| ||¬ p → q ||G&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18262</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18262"/>
				<updated>2024-10-07T08:37:26Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
Enllaça cada proposició amb la seva formalització:&lt;br /&gt;
&lt;br /&gt;
::p: plou&lt;br /&gt;
::q: fa sol&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 1||Llueve y hace sol || ||¬ p ||&lt;br /&gt;
|-&lt;br /&gt;
| 2||Llueve y no hace sol || || ||N&lt;br /&gt;
|-&lt;br /&gt;
| 3||Llueve o hace sol || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 4||Si no llueve, hace sol || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 5||No es cierto que llueva || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 6||No es cierto que no llueva || || ||&lt;br /&gt;
|-&lt;br /&gt;
| 7||No es cierto que no llueva|| || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18261</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18261"/>
				<updated>2024-10-07T08:34:22Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| PK|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| PK|| || || ||N&lt;br /&gt;
|-&lt;br /&gt;
| PK|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| PK|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| PK|| || || ||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18260</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18260"/>
				<updated>2024-10-07T08:32:59Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Key Type&lt;br /&gt;
| PK|| || || || &lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Null / Unique&lt;br /&gt;
|NN,U||NN|| || || || ||NN&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Default Value&lt;br /&gt;
| || || || || || ||System Date&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Data Type&lt;br /&gt;
| Number||Varchar2||Varchar2||Varchar2||Varchar2||Varchar2||Date&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Length&lt;br /&gt;
| 10||25||25||100||30||15||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18259</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18259"/>
				<updated>2024-10-07T08:32:02Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Key Type&lt;br /&gt;
| PK|| || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Null / Unique&lt;br /&gt;
|NN,U||NN|| || || || ||NN&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Default Value&lt;br /&gt;
| || || || || || ||System Date&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Data Type&lt;br /&gt;
| Number||Varchar2||Varchar2||Varchar2||Varchar2||Varchar2||Date&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Length&lt;br /&gt;
| 10||25||25||100||30||15||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18258</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18258"/>
				<updated>2024-10-07T08:30:43Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;2&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;margin: 1em 1em 1em 0; background: #f9f9f9; border: 1px #aaa solid; border-collapse: collapse; font-size: 95%;&amp;quot;&lt;br /&gt;
|+ align=&amp;quot;center&amp;quot; style=&amp;quot;background:DarkSlateBlue; color:white&amp;quot;|&amp;lt;big&amp;gt;'''MEMBER'''&amp;lt;/big&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Key Type&lt;br /&gt;
| PK|| || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Null / Unique&lt;br /&gt;
|NN,U||NN|| || || || ||NN&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Default Value&lt;br /&gt;
| || || || || || ||System Date&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Data Type&lt;br /&gt;
| Number||Varchar2||Varchar2||Varchar2||Varchar2||Varchar2||Date&lt;br /&gt;
|-&lt;br /&gt;
! align=&amp;quot;left&amp;quot; style=&amp;quot;background:Lavender; color:Black&amp;quot;|Length&lt;br /&gt;
| 10||25||25||100||30||15||&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18257</id>
		<title>MPO - Raponament lògic / AEA1A1: Solucions exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18257"/>
				<updated>2024-10-07T08:25:24Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Exercici 1===&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra! &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3  &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents preposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; q'''&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬(p &amp;amp;#94; q)'''&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
::p = m'agrada dormir&lt;br /&gt;
::q = m'agrada matinar&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
::p = tu estàs equivocat&lt;br /&gt;
::q = la notícia que has llegit és falsa&lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
::p = estàs boja&lt;br /&gt;
::q = has vingut aquí&lt;br /&gt;
&lt;br /&gt;
::'''¬p → ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; (q ˅ r)'''&lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''(p &amp;amp;#94; q) ˅ r'''&lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::p = hi ha verdadera democracia&lt;br /&gt;
::q = hi ha detencions arbitràrie&lt;br /&gt;
::r = hi hi violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::'''p → (¬q &amp;amp;#94; ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::p = Robert farà el doctorat&lt;br /&gt;
::q = Robert obtindrà la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::p = ve en tren&lt;br /&gt;
::q = ve en cotxe&lt;br /&gt;
::r = arribarà abans de les sis&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → r'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::'''p → q, r → q |- (p ˅ r) → q'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q: &lt;br /&gt;
&lt;br /&gt;
::'''p → q'''&lt;br /&gt;
&lt;br /&gt;
:*No es el caso que p y q:&lt;br /&gt;
&lt;br /&gt;
::'''¬(p ˄ q)'''&lt;br /&gt;
&lt;br /&gt;
:*p solamente si q y no-r: &lt;br /&gt;
&lt;br /&gt;
::'''p ↔ (q ˄ ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:*p o no-q: &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ ¬q'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces no-r o s: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → (¬r ˅ s)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q, y si q, entonces p: &lt;br /&gt;
&lt;br /&gt;
::'''(p → q) ˄ (q → p)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. p. Luego si q, entonces r: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, p |- q → r'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t:&lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, (r ˄ s) → t |- (p ˄ q ˄ s) → t'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
&lt;br /&gt;
::'''¬(¬p)'''&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
::q: me gusta leer libros de ciencia ficción&lt;br /&gt;
&lt;br /&gt;
::'''p ˄ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
::p: los gatos de mi hermana sueltan pelo&lt;br /&gt;
::q: me gusta acariciar los gatos&lt;br /&gt;
&lt;br /&gt;
::'''¬p → q'''&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
::p: ver un marciano con mis propios ojos&lt;br /&gt;
::q: creer en los extraterrestres&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
::p: salir a dar un paseo&lt;br /&gt;
::q: estudiar como un energúmeno &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico.&lt;br /&gt;
&lt;br /&gt;
::p: los elefantes vuelan &lt;br /&gt;
::q: los elefantes tocan el acordeón&lt;br /&gt;
::r: estar loco&lt;br /&gt;
::s: internar en un psiquiátrico&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → (r ˄ s)''' &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
::p: ir de vacaciones&lt;br /&gt;
::q: no hacer nada &lt;br /&gt;
::r: tener tiempo&lt;br /&gt;
::s: ir a trabajar&lt;br /&gt;
&lt;br /&gt;
::'''(r ˄ ¬s) → (p ˅ q)'''&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18256</id>
		<title>MPO - Raponament lògic / AEA1A1: Solucions exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18256"/>
				<updated>2024-10-07T08:02:38Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Exercici 1===&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra! &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3  &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents preposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; q'''&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬(p &amp;amp;#94; q)'''&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
::p = m'agrada dormir&lt;br /&gt;
::q = m'agrada matinar&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
::p = tu estàs equivocat&lt;br /&gt;
::q = la notícia que has llegit és falsa&lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
::p = estàs boja&lt;br /&gt;
::q = has vingut aquí&lt;br /&gt;
&lt;br /&gt;
::'''¬p → ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; (q ˅ r)'''&lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''(p &amp;amp;#94; q) ˅ r'''&lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::p = hi ha verdadera democracia&lt;br /&gt;
::q = hi ha detencions arbitràrie&lt;br /&gt;
::r = hi hi violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::'''p → (¬q &amp;amp;#94; ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::p = Robert farà el doctorat&lt;br /&gt;
::q = Robert obtindrà la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::p = ve en tren&lt;br /&gt;
::q = ve en cotxe&lt;br /&gt;
::r = arribarà abans de les sis&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → r'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::'''p → q, r → q |- (p ˅ r) → q'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q: &lt;br /&gt;
&lt;br /&gt;
::'''p → q'''&lt;br /&gt;
&lt;br /&gt;
:*No es el caso que p y q:&lt;br /&gt;
&lt;br /&gt;
::'''¬(p ˄ q)'''&lt;br /&gt;
&lt;br /&gt;
:*p solamente si q y no-r: &lt;br /&gt;
&lt;br /&gt;
::'''p ↔ (q ˄ ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:*p o no-q: &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ ¬q'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces no-r o s: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → (¬r ˅ s)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q, y si q, entonces p: &lt;br /&gt;
&lt;br /&gt;
::'''(p → q) ˄ (q → p)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. p. Luego si q, entonces r: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, p |- q → r'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t:&lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, (r ˄ s) → t |- (p ˄ q ˄ s) → t'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
&lt;br /&gt;
::'''¬(¬p)'''&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
::q: me gusta leer libros de ciencia ficción&lt;br /&gt;
&lt;br /&gt;
::'''p ˄ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
::p: los gatos de mi hermana sueltan pelo&lt;br /&gt;
::q: me gusta acariciar los gatos&lt;br /&gt;
&lt;br /&gt;
::'''¬p → q'''&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
::p: ver un marciano con mis propios ojos&lt;br /&gt;
::q: creer en los extraterrestres&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
::p: salir a dar un paseo&lt;br /&gt;
::q: estudiar como un energúmeno &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico.&lt;br /&gt;
&lt;br /&gt;
::p: los elefantes vuelan &lt;br /&gt;
::q: los elefantes tocan el acordeón&lt;br /&gt;
::r: estar loco&lt;br /&gt;
::s: internar en un psiquiátrico&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → (r ˄ s)''' &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
::p: ir de vacaciones&lt;br /&gt;
::q: no hacer nada &lt;br /&gt;
::r: tener tiempo&lt;br /&gt;
::s: ir a trabajar&lt;br /&gt;
&lt;br /&gt;
::'''(r ˄ ¬s) → (p ˅ q)'''&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18255</id>
		<title>MPO - Raponament lògic / AEA1A1: Solucions exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Solucions_exercicis&amp;diff=18255"/>
				<updated>2024-10-07T08:02:17Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Exercici 1===&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra! &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3  &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''No és proposició'''&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;'''És proposició'''&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100 &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; '''És proposició'''&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents preposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; q'''&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''¬(p &amp;amp;#94; q)'''&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::p = vaig veure la pel·lícula&lt;br /&gt;
::q = vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
::p = m'agrada dormir&lt;br /&gt;
::q = m'agrada matinar&lt;br /&gt;
&lt;br /&gt;
::'''¬p &amp;amp;#94; ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
::p = tu estàs equivocat&lt;br /&gt;
::q = la notícia que has llegit és falsa&lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
::p = estàs boja&lt;br /&gt;
::q = has vingut aquí&lt;br /&gt;
&lt;br /&gt;
::'''¬p → ¬q'''&lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''p &amp;amp;#94; (q ˅ r)'''&lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
::p = plou&lt;br /&gt;
::q = neva&lt;br /&gt;
::r = bufa el vent&lt;br /&gt;
&lt;br /&gt;
::'''(p &amp;amp;#94; q) ˅ r'''&lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::p = hi ha verdadera democracia&lt;br /&gt;
::q = hi ha detencions arbitràrie&lt;br /&gt;
::r = hi hi violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
::'''p → (¬q &amp;amp;#94; ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::p = Robert farà el doctorat&lt;br /&gt;
::q = Robert obtindrà la llicenciatura&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::p = ve en tren&lt;br /&gt;
::q = ve en cotxe&lt;br /&gt;
::r = arribarà abans de les sis&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → r'''&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
::p → q, r → q |- (p ˅ r) → q&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!----&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q: &lt;br /&gt;
&lt;br /&gt;
::'''p → q'''&lt;br /&gt;
&lt;br /&gt;
:*No es el caso que p y q:&lt;br /&gt;
&lt;br /&gt;
::'''¬(p ˄ q)'''&lt;br /&gt;
&lt;br /&gt;
:*p solamente si q y no-r: &lt;br /&gt;
&lt;br /&gt;
::'''p ↔ (q ˄ ¬r)'''&lt;br /&gt;
&lt;br /&gt;
:*p o no-q: &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ ¬q'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces no-r o s: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → (¬r ˅ s)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p, entonces q, y si q, entonces p: &lt;br /&gt;
&lt;br /&gt;
::'''(p → q) ˄ (q → p)'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. p. Luego si q, entonces r: &lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, p |- q → r'''&lt;br /&gt;
&lt;br /&gt;
:*Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t:&lt;br /&gt;
&lt;br /&gt;
::'''(p ˄ q) → r, (r ˄ s) → t |- (p ˄ q ˄ s) → t'''&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
&lt;br /&gt;
::'''¬(¬p)'''&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
::p: me gusta bailar&lt;br /&gt;
::q: me gusta leer libros de ciencia ficción&lt;br /&gt;
&lt;br /&gt;
::'''p ˄ q'''&lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
::p: los gatos de mi hermana sueltan pelo&lt;br /&gt;
::q: me gusta acariciar los gatos&lt;br /&gt;
&lt;br /&gt;
::'''¬p → q'''&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
::p: ver un marciano con mis propios ojos&lt;br /&gt;
::q: creer en los extraterrestres&lt;br /&gt;
&lt;br /&gt;
::'''p ↔ q'''&lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
::p: salir a dar un paseo&lt;br /&gt;
::q: estudiar como un energúmeno &lt;br /&gt;
&lt;br /&gt;
::'''p ˅ q'''&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico.&lt;br /&gt;
&lt;br /&gt;
::p: los elefantes vuelan &lt;br /&gt;
::q: los elefantes tocan el acordeón&lt;br /&gt;
::r: estar loco&lt;br /&gt;
::s: internar en un psiquiátrico&lt;br /&gt;
&lt;br /&gt;
::'''(p ˅ q) → (r ˄ s)''' &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
::p: ir de vacaciones&lt;br /&gt;
::q: no hacer nada &lt;br /&gt;
::r: tener tiempo&lt;br /&gt;
::s: ir a trabajar&lt;br /&gt;
&lt;br /&gt;
::'''(r ˄ ¬s) → (p ˅ q)'''&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18254</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18254"/>
				<updated>2024-10-07T07:54:26Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo que ir a trabajar.&lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18253</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18253"/>
				<updated>2024-10-07T07:54:11Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Proposicions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r &lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t &lt;br /&gt;
&lt;br /&gt;
===Exercici 4===&lt;br /&gt;
&lt;br /&gt;
Formalitza les següents proposicons:&lt;br /&gt;
&lt;br /&gt;
:* No es cierto que no me guste bailar.&lt;br /&gt;
&lt;br /&gt;
:* Me gusta bailar y leer libros de ciencia ficción. &lt;br /&gt;
&lt;br /&gt;
:* Si los gatos de mi hermana no soltaran tanto pelo me gustaría acariciarlos.&lt;br /&gt;
&lt;br /&gt;
:* Si y sólo si viera un marciano con mis propios ojos, creería que hay vida extraterrestre. &lt;br /&gt;
&lt;br /&gt;
:* Una de dos: o salgo a dar un paseo, o me pongo a estudiar como un energúmeno.&lt;br /&gt;
&lt;br /&gt;
:*Si los elefantes volaran o supieran tocar el acordeón, pensaría que estoy como una&lt;br /&gt;
regadera y dejaría que me internaran en un psiquiátrico. &lt;br /&gt;
&lt;br /&gt;
:* Prefiero ir de vacaciones o estar sin hacer nada si tengo tiempo para ello y no tengo&lt;br /&gt;
que ir a trabajar. &lt;br /&gt;
&lt;br /&gt;
===Exercici 5===&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	<entry>
		<id>http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18252</id>
		<title>MPO - Raponament lògic / AEA1A1: Exercicis</title>
		<link rel="alternate" type="text/html" href="http://wikiserver.infomerce.es/index.php?title=MPO_-_Raponament_l%C3%B2gic_/_AEA1A1:_Exercicis&amp;diff=18252"/>
				<updated>2024-10-07T07:47:27Z</updated>
		
		<summary type="html">&lt;p&gt;Srebordosa: /* Exercici 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Proposicions==&lt;br /&gt;
&lt;br /&gt;
===Exercici 1===&lt;br /&gt;
&lt;br /&gt;
Indica quines de les següents expressions són proposicions:&lt;br /&gt;
&lt;br /&gt;
:* Finlandia pertany a la Unió Europea&lt;br /&gt;
&lt;br /&gt;
:* El famós Linus Torvalds&lt;br /&gt;
&lt;br /&gt;
:* Catalunya té 5 provincies&lt;br /&gt;
&lt;br /&gt;
:* La víbora té orelles&lt;br /&gt;
&lt;br /&gt;
:* Quants anys han transcorregut&lt;br /&gt;
&lt;br /&gt;
:* Visca la terra!&lt;br /&gt;
&lt;br /&gt;
:* La taronja és un mineral&lt;br /&gt;
&lt;br /&gt;
:* 2X + 1 = 3&lt;br /&gt;
&lt;br /&gt;
:* L'ànec és un mamifer&lt;br /&gt;
&lt;br /&gt;
:* 10 &amp;gt; -100&lt;br /&gt;
&lt;br /&gt;
===Exercici 2===&lt;br /&gt;
&lt;br /&gt;
Simbolitza les següents proposicions:&lt;br /&gt;
&lt;br /&gt;
:* No vaig veure la pel·lícula, però vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Ni vaig veure la pel·lícula ni vaig llegir la novel·la&lt;br /&gt;
&lt;br /&gt;
:* No és cert que veiés la pel·lícula i llegís la novel·la&lt;br /&gt;
&lt;br /&gt;
:* Vaig veure la pel·lícula encara que no vaig llegir la novel·la &lt;br /&gt;
&lt;br /&gt;
:* No m'agrada dormir ni matinar &lt;br /&gt;
&lt;br /&gt;
:* O tu estàs equivocat o és falsa la notícia que has llegit &lt;br /&gt;
&lt;br /&gt;
:* Si no estiguessis boja, no hauries vingut aquí &lt;br /&gt;
&lt;br /&gt;
:* Plou i o bé neva o bufa el vent &lt;br /&gt;
&lt;br /&gt;
:* O està plovent i nevant o està bufant el vent &lt;br /&gt;
&lt;br /&gt;
:* Si hi ha veritable democràcia, aleshores no hi ha detencions arbitràries ni altres violacions dels drets civils&lt;br /&gt;
&lt;br /&gt;
:* Robert farà el doctorat quan i només quan obtingui la llicenciatura&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren o en cotxe arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
:* Si ve en tren arribarà abans de les sis. Si ve en cotxe arribarà abans de les sis. Per tant, si ve amb tren com si ve amb cotxe, arribarà abans de les sis.&lt;br /&gt;
&lt;br /&gt;
===Exercici 3===&lt;br /&gt;
&lt;br /&gt;
Simbolitza:&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q&lt;br /&gt;
&lt;br /&gt;
:* No es el caso que p y q&lt;br /&gt;
&lt;br /&gt;
:* p solamente si q y no-r&lt;br /&gt;
&lt;br /&gt;
:* p o no-q&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces no-r o s&lt;br /&gt;
&lt;br /&gt;
:* Si p, entonces q, y si q, entonces p&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. p. Luego si q, entonces r (de moment no!)&lt;br /&gt;
&lt;br /&gt;
:* Si p y q, entonces r. Si r y s, entonces t. Luego si p y q y s, entonces t (de moment no!)&lt;/div&gt;</summary>
		<author><name>Srebordosa</name></author>	</entry>

	</feed>