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 40: Línia 40:
 
::::INDEX BY BINARY_INTEGER;
 
::::INDEX BY BINARY_INTEGER;
 
    
 
    
:::TYPE rev_salary_table_type IS TABLE OF NUMBER(7,2)
+
:::TYPE rev_salary_table_type IS TABLE OF NUMBER(2)
 
::::INDEX BY BINARY_INTEGER;
 
::::INDEX BY BINARY_INTEGER;
  
Línia 48: Línia 48:
 
      
 
      
 
:::v_empno emp.empno%TYPE := &p_empno;
 
:::v_empno emp.empno%TYPE := &p_empno;
 +
 +
:::v_deptno BINARY_INTEGER;
 
    
 
    
:::v_emp emp_record;
+
:::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_ename.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;
  
BEGIN
+
::END;
  DELETE
 
  FROM top_dogs;
 
  SELECT ename, sal
 
  INTO v_ename, v_sal
 
  FROM emp
 
  WHERE empno = v_empno;
 
  ename_table(i) := v_ename;
 
  sal_table(i) := v_sal;
 
  INSERT INTO top_dogs (name,salary)
 
  VALUES (ename_table(i), sal_table(i));
 
  COMMIT;
 
END;
 

Revisió del 12:45, 24 abr 2014

T7- Tipus de dades compostes

  • Exercici 1

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. Crea una nova taula per emmagatzemar salaris i sous.

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

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

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

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

e. 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_ename.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;