Diferència entre revisions de la pàgina «M2 - Bases de dades / Exercicis UF3: Llenguatges SQL / Solucions PL-SQL T7»

De wikiserver
Dreceres ràpides: navegació, cerca
(T7- Tipus de dades compostes)
(T7- Tipus de dades compostes)
Línia 67: Línia 67:
 
   FOR i IN 1..3 LOOP
 
   FOR i IN 1..3 LOOP
 
     INSERT top_dogs
 
     INSERT top_dogs
     VALUES (emp_table(1).name, emp_talbe(1).salary);
+
     VALUES (emp_table(i).name, emp_table(i).salary);
 
   END LOOP;
 
   END LOOP;
  

Revisió del 17:26, 22 abr 2015

T7- Tipus de dades compostes

Crea una nova taula per emmagatzemar salaris i sous.

SQL> CREATE TABLE top_dogs
  2  (name    VARCHAR2(25),
  3   salary  NUMBER(11,2));
  • Exercici 1

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ó.

Creem el tipus registre:

 TYPE emp_record_type IS RECORD
    (name    VARCHAR2(25),
     salary  NUMBER(11,2));

Creem el tipus taula de registres:

 TYPE emp_table_type IS TABLE OF emp_record_type;
  • Alternativa: TYPE emp_table_type IS TABLE OF top_dogs%TYPE (amb aquesta opció no caldria haver declarat el tipus registre)

Creem la variable taula de registres:

 emp_table emp_table_type;

Inicialitzem la taula:

 emp_table(1).name := 'Pere';
 emp_table(1).salary := 3000;
 emp_table(2).name := 'Joan';
 emp_table(2).salary := 4000;
 emp_table(3).name := 'Raquel';
 emp_table(3).salary := 3500;

Inserim els valors a la taula TOP_DOGS:

 FOR i IN 1..3 LOOP
   INSERT top_dogs
   VALUES (emp_table(1).name, emp_talbe(1).salary);
 END LOOP;

Programa sencer:

DECLARE

  TYPE emp_record_type IS RECORD
     (name    VARCHAR2(25),
      salary  NUMBER(11,2));
  TYPE emp_table_type IS TABLE OF emp_record_type
       INDEX BY BINARY_INTEGER;

  emp_table emp_table_type;
BEGIN

  emp_table(1).name := 'Pere';
  emp_table(1).salary := 3000;
  emp_table(2).name := 'Joan';
  emp_table(2).salary := 4000;
  emp_table(3).name := 'Raquel';
  emp_table(3).salary := 3500;

  FOR i IN 1..3 LOOP
    INSERT top_dogs
    VALUES (emp_table(i).name, emp_table(i).salary);
  END LOOP;

END;

  • Exercici 2

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.

a. Declara dues taules: rev_salary_table_type per emmagatzemar el percentatge de augment de salari. i emp_table_type per guardar l'empleat tractat.

b. Inicialitza les posicions de la taula rev_salary_table, corresponents als números de departament de la taula dept, amb els diferents percentatges:

      10 -->  2; 20 --> 3; 30 --> 4; 40 --> 3 ...

c. Guarda el nom i salari en la taula emp_table en la posició corresponent al departament de l'empleat.

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.


SET VERIFY OFF
ACCEPT p_empno PROMPT 'Número de empleado:'
DECLARE
TYPE emp_record IS RECORD
(
ename emp.ename%TYPE ,
sal emp.sal%TYPE
);
TYPE emp_table_type IS TABLE OF emp_record
INDEX BY BINARY_INTEGER;
TYPE rev_salary_table_type IS TABLE OF NUMBER(2)
INDEX BY BINARY_INTEGER;
emp_table emp_table_type;
rev_salary_table rev_salary_talbe_type;
v_empno emp.empno%TYPE := &p_empno;
v_deptno BINARY_INTEGER;
v_emp emp_record;
v_salary_rev emp.sal%TYPE;
BEGIN
rev_salary_table(10) := 2;
rev_salary_table(20) := 3;
rev_salary_table(30) := 4;
rev_salary_table(40) := 3;
SELECT ename, sal, deptno
INTO v_emp.ename, v_emp.sal, v_deptno
FROM emp
WHERE empno = v_empno;
emp_table(v_deptno) := v_emp;
v_salary_rev := emp_table(v_deptno).sal * (1 + rev_salary_table(v_deptno)/100)
INSERT INTO top_dogs (name,salary)
VALUES (emp_table(v_deptno).ename, v_salary_rev);
COMMIT;
END;
/
SET VERIFY ON