<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=DAI-C8-EC%3A_Excepcions._Exercicis_proposats</id>
	<title>DAI-C8-EC: Excepcions. Exercicis proposats - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=DAI-C8-EC%3A_Excepcions._Exercicis_proposats"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=DAI-C8-EC:_Excepcions._Exercicis_proposats&amp;action=history"/>
	<updated>2026-10-17T03:32:53Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=DAI-C8-EC:_Excepcions._Exercicis_proposats&amp;diff=247969&amp;oldid=prev</id>
		<title>Joan: /* Desenvolupament */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=DAI-C8-EC:_Excepcions._Exercicis_proposats&amp;diff=247969&amp;oldid=prev"/>
		<updated>2011-11-22T18:32:03Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Desenvolupament&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Objectius==&lt;br /&gt;
Unitat Didàctica: UD 3. Excepcions&lt;br /&gt;
&lt;br /&gt;
L'alumne ja haurà instal.lat l'Oracle (client o servidor) en el seu ordinador, i podrà treballar en local o en el servidor 192.168.0.10. Així mateix, s'espera que ja estigui en condicions per poder treballar a casa.&lt;br /&gt;
&lt;br /&gt;
==Desenvolupament==&lt;br /&gt;
Altres exemples senzills explicats a classe:&lt;br /&gt;
*http://www.devjoker.com/contenidos/Tutorial-PLSQL/48/Excepciones-en-PLSQL.aspx&lt;br /&gt;
&lt;br /&gt;
Exercicis a realitzar:&lt;br /&gt;
&lt;br /&gt;
1. Desarrollar un procedimiento que permita insertar nuevos departamentos según las siguientes especificaciones:&lt;br /&gt;
*Se pasará al procedimiento el nombre del departamento y la localidad.&lt;br /&gt;
*El procedimiento insertará la fila nueva asignando como número de departamento la decena siguiente al número mayor de la tabla.&lt;br /&gt;
*Se incluirá gestión de posibles errores.&lt;br /&gt;
&lt;br /&gt;
2. Codificar un procedimiento reciba como parámetros un numero de departamento, un importe y un porcentaje; y suba el salario a todos los empleados del departamento indicado en la llamada. La subida será el porcentaje o el importe indicado en la llamada (el que sea más beneficioso para el empleado en cada caso empleado).&lt;br /&gt;
&lt;br /&gt;
3. Diseñar una aplicación que simule un listado de liquidación de los empleados según las siguientes especificaciones:&lt;br /&gt;
&lt;br /&gt;
*El listado tendrá el siguiente formato para cada empleado:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
**********************************************************************&lt;br /&gt;
Liquidación del empleado:...................(1) 	Dpto:.................(2) 	Oficio:...........(3)&lt;br /&gt;
&lt;br /&gt;
Salario		: ............(4)&lt;br /&gt;
Trienios		:.............(5)&lt;br /&gt;
Comp. Responsabil	:.............(6)&lt;br /&gt;
Comisión		:.............(7)&lt;br /&gt;
 			------------&lt;br /&gt;
Total		           :.............(8)&lt;br /&gt;
**********************************************************************&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*Donde:&lt;br /&gt;
**1 ,2, 3 y 4 Corresponden al apellido, departamento, oficio y salario del empleado.&lt;br /&gt;
**5 Es el importe en concepto de trienios. Cada trienio son tres años completos desde la fecha de alta hasta la de emisión y supone 5000 Ptas.&lt;br /&gt;
**6 Es el complemento por responsabilidad. Será de 10000Ptas por cada empleado que se encuentre directamente a cargo del empleado en cuestión.&lt;br /&gt;
**7 Es la comisión. Los valores nulos serán sustituidos por ceros.&lt;br /&gt;
**8 Suma de todos los conceptos anteriores.&lt;br /&gt;
*El listado irá ordenado por Apellido. &lt;br /&gt;
&lt;br /&gt;
===Solucions===&lt;br /&gt;
1.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE PROCEDURE insertar_depart(&lt;br /&gt;
	nom_dep VARCHAR2,&lt;br /&gt;
	loc VARCHAR2)&lt;br /&gt;
AS&lt;br /&gt;
   CURSOR c_dep IS SELECT dnom FROM depart WHERE dnom = nom_dep; &lt;br /&gt;
   v_dummy DEPART.DNOM%TYPE DEFAULT NULL;&lt;br /&gt;
   v_ulti_num DEPART.DEPT_NO%TYPE;&lt;br /&gt;
   nom_duplicat EXCEPTION;&lt;br /&gt;
BEGIN&lt;br /&gt;
	/* Comprovació de que el departament no està duplicat */&lt;br /&gt;
OPEN c_dep;&lt;br /&gt;
FETCH c_dep INTO v_dummy; &lt;br /&gt;
CLOSE c_dep;&lt;br /&gt;
IF v_dummy IS NOT NULL THEN&lt;br /&gt;
	    RAISE nom_duplicat;&lt;br /&gt;
	END IF;&lt;br /&gt;
&lt;br /&gt;
	/* Captura de l'últim número i càlcul del següent */&lt;br /&gt;
     SELECT MAX(dept_no) INTO v_ulti_num FROM depart;&lt;br /&gt;
	&lt;br /&gt;
     /* Inserció de la nova fila */&lt;br /&gt;
	INSERT INTO depart VALUES (v_ulti_num + 10, nom_dep, loc);&lt;br /&gt;
EXCEPTION&lt;br /&gt;
WHEN nom_duplicat THEN	&lt;br /&gt;
   DBMS_OUTPUT.PUT_LINE('Err. departament duplicat');&lt;br /&gt;
WHEN OTHERS THEN&lt;br /&gt;
   RAISE_APPLICATION_ERROR(-20005,'Err. Operació cancelada');&lt;br /&gt;
END insertar_depart;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
2. (falta millorar el control d'excepcions: mirar que existeixi el departament, import i percentatge positius)&lt;br /&gt;
També es pot fer amb un CURSOR FOR UPDATE&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE PROCEDURE pujada_sal1(&lt;br /&gt;
	num_dep emple.dept_no%TYPE,&lt;br /&gt;
	import NUMBER,&lt;br /&gt;
	percentatge NUMBER)&lt;br /&gt;
AS&lt;br /&gt;
	CURSOR c_sal IS SELECT salari,ROWID FROM emple  WHERE dept_no = num_dep;&lt;br /&gt;
	vr_sal c_sal%ROWTYPE;&lt;br /&gt;
	v_imp_pct NUMBER(10);&lt;br /&gt;
BEGIN&lt;br /&gt;
	OPEN c_sal;&lt;br /&gt;
	FETCH c_sal INTO vr_sal;&lt;br /&gt;
	WHILE c_sal%FOUND LOOP&lt;br /&gt;
&lt;br /&gt;
        /* Guardar en v_imp_pct l'import més gran */&lt;br /&gt;
        v_imp_pct := GREATEST((vr_sal.salari/100)*percentatge, import);	   &lt;br /&gt;
&lt;br /&gt;
        /* Actualitzar */&lt;br /&gt;
        UPDATE EMPLE SET SALARI = SALARI + v_imp_pct WHERE ROWID = vr_sal.rowid;&lt;br /&gt;
	   &lt;br /&gt;
      	FETCH c_sal INTO vr_sal;	 &lt;br /&gt;
	END LOOP;&lt;br /&gt;
	CLOSE c_sal;&lt;br /&gt;
&lt;br /&gt;
	COMMIT;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN NO_DATA_FOUND THEN&lt;br /&gt;
	    DBMS_OUTPUT.PUT_LINE('Err. cap fila actualitzada');&lt;br /&gt;
END pujada_sal1;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
3.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE PROCEDURE liquidar&lt;br /&gt;
AS&lt;br /&gt;
	CURSOR c_emp IS&lt;br /&gt;
 	SELECT cognom, emp_no, ofici, salari, NVL(comissio,0) comissio, dept_no, data_alt&lt;br /&gt;
	FROM emple ORDER BY cognom;&lt;br /&gt;
	vr_emp c_emp%ROWTYPE;&lt;br /&gt;
	v_trien NUMBER(9) DEFAULT 0;&lt;br /&gt;
	v_comp_r NUMBER(9);&lt;br /&gt;
	v_total NUMBER(10);&lt;br /&gt;
BEGIN&lt;br /&gt;
	FOR vr_emp in c_emp LOOP&lt;br /&gt;
&lt;br /&gt;
		/* Calcular trienis. Crida a la funció trienis creada un exercici del capítol 'Fonaments' */ &lt;br /&gt;
v_trien := trienis(vr_emp.data_alt,SYSDATE)*5000;&lt;br /&gt;
  		&lt;br /&gt;
		/* Calcular complement de responsabilitat. Es tanca en un bloc doncs aixecarà NO_DATA_FOUND*/&lt;br /&gt;
BEGIN&lt;br /&gt;
	SELECT COUNT(*) INTO v_comp_r FROM EMPLE WHERE DIR = vr_emp.emp_no;&lt;br /&gt;
	v_comp_r := v_comp_r *10000;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
WHEN NO_DATA_FOUND THEN&lt;br /&gt;
	v_comp_r:=0;&lt;br /&gt;
END; &lt;br /&gt;
&lt;br /&gt;
/* Calcular el total de l'empleat */&lt;br /&gt;
v_total := vr_emp.salari + vr_emp.comissio + v_trien + v_comp_r;&lt;br /&gt;
&lt;br /&gt;
/* Visualitzar dades de l'empleat */&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE('*************************************');&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(' Liquidació de : '|| vr_emp.cognom ||'  Dept:  ' || vr_emp.dept_no || '  Ofici:  ' || vr_emp.ofici);&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(RPAD('Salari:',16) ||LPAD(TO_CHAR(vr_emp.salari,'9,999,999'),12));&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(RPAD('Trienis:  ',16) || LPAD(TO_CHAR(v_trien,'9,999,999'),12));&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE('Comp. Respons:  ' ||LPAD(TO_CHAR(v_comp_r,'9,999,999'),12));&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(RPAD('Comision:  ' ,16) ||LPAD(TO_CHAR(vr_emp.comissio,'9,999,999'),12));&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE('------------------');&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE(RPAD(' Total  : ',16)&lt;br /&gt;
||LPAD(TO_CHAR(v_total,'9,999,999') ,12));&lt;br /&gt;
DBMS_OUTPUT.PUT_LINE('**************************************');&lt;br /&gt;
END LOOP;&lt;br /&gt;
EXCEPTION&lt;br /&gt;
	WHEN NO_DATA_FOUND THEN&lt;br /&gt;
	  DBMS_OUTPUT.PUT_LINE('No sha trobat cap fila');&lt;br /&gt;
END liquidar;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
/* Nota: También se puede utilizar una cláusula SELECT más compleja:&lt;br /&gt;
CURSOR c_emp IS&lt;br /&gt;
 	SELECT COGNOM, EMP_NO, OFICI,(EMP_CARREC * 10000) COM_RESPONSABILIDAD, SALARI, NVL(COMISSIO, 0) COMISION, DEPT_NO, TRIENIS(DATA_ALT, SYSDATE) * 5000 TOT_TRIENIS&lt;br /&gt;
  	  FROM EMPLE,(SELECT DIR,COUNT(*) EMP_CARREC FROM EMPLE&lt;br /&gt;
	  GROUP BY DIR) DIREC&lt;br /&gt;
	  WHERE EMPLE.EMP_NO = DIREC.DIR(+) &lt;br /&gt;
	  ORDER BY COGNOM;&lt;br /&gt;
de esta forma se simplifica el programa y se evita la utilización de variables de trabajo. */&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Entrega==&lt;br /&gt;
* entregar els fitxers DAI2AXX_script_NA5.sql i DAI2AXX_NA3.log. Si has treballat per parelles: DAI2AXXXX_script_NA5.sql i DAI2AXXXX_NA5.log, indicant a dins clarament el nom i el número de classe (comentaris amb REM). Exercici individual o per parelles.&lt;br /&gt;
* entregar al Moodle: http://192.168.0.15/moodle&lt;br /&gt;
&lt;br /&gt;
==Recursos==&lt;br /&gt;
En el Moodle també pots descarregar el codi per crear les taules, i el codi que s'ha vist a classe.&lt;br /&gt;
&lt;br /&gt;
==Durarda==&lt;br /&gt;
1,5 hores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, octubre 2009&lt;br /&gt;
[[Categoria: IES Jaume Balmes]]&lt;br /&gt;
[[Categoria: Pràctiques DAI-C8-EC]]&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>