Advertisement
Elyspio

TD7

Apr 15th, 2018
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 5.09 KB | None | 0 0
  1.       SELECT * FROM jobs;
  2.  
  3.       -- 1
  4.       DROP TABLE jobs;
  5.       CREATE  TABLE JOBS
  6.       (
  7.         id NUMBER,
  8.         poste VARCHAR2(100),
  9.         CONSTRAINT pk_jobs PRIMARY KEY (id, poste)
  10.       );
  11.  
  12.       -- 1.
  13.  
  14.       CREATE  OR REPLACE PROCEDURE AJOUT_JOB(id IN jobs.id%TYPE , poste IN jobs.poste%TYPE )
  15.         IS
  16.           e_same_id EXCEPTION;
  17.           e_same_poste EXCEPTION;
  18.           CURSOR c_job IS SELECT * FROM jobs;
  19.         BEGIN
  20.           FOR v_job IN c_job LOOP
  21.             IF v_job.id = id THEN
  22.               RAISE e_same_id;
  23.             END IF;
  24.  
  25.             IF v_job.poste = poste THEN
  26.               RAISE e_same_poste;
  27.             END IF;
  28.  
  29.           END LOOP;
  30.           INSERT INTO JOBS VALUES(id, poste);
  31.  
  32.         EXCEPTION
  33.           WHEN e_same_id THEN
  34.             PRINT('Attention : ID ' || id  || ' est déja présent dans la table jobs.');
  35.           WHEN e_same_poste THEN
  36.             PRINT('Le Metier ' || poste || ' est déja présent avec un autre ID.');
  37.  
  38.         END ;
  39.  
  40.  
  41.       BEGIN
  42.  
  43.         AJOUT_JOB(1, 'Secrétaire');
  44.         AJOUT_JOB(2, 'Tresorier');
  45.         AJOUT_JOB(3, 'Président');
  46.         AJOUT_JOB(4, 'Vice Président');
  47.       END;
  48.  
  49.       BEGIN
  50.  
  51.         AJOUT_JOB(5, 'Secrétaire');
  52.         AJOUT_JOB(6, 'Tresorier');
  53.         AJOUT_JOB(7, 'Président');
  54.         AJOUT_JOB(8, 'Vice Président');
  55.       END;
  56.  
  57.  
  58.   COMMIT ;
  59.  
  60.       -- 2.
  61.  
  62.       CREATE  OR REPLACE  PROCEDURE MODIF_job(in_id IN NUMBER, newPoste IN VARCHAR2) IS
  63.         v_id NUMBER;
  64.  
  65.         BEGIN
  66.           UPDATE jobs SET poste = newPoste WHERE id = in_id;
  67.       END;
  68.  
  69.  
  70.   BEGIN
  71.     MODIF_job(1, 'Secrétaire');
  72.   END;
  73.  
  74.   SELECT * FROM JOBS;
  75.  
  76.  
  77.  
  78.  
  79.  
  80.   --3
  81.       SELECT * FROM emp;
  82.  
  83.       CREATE  OR REPLACE PROCEDURE empSupp IS
  84.  
  85.         CURSOR c_emp IS SELECT * FROM emp;
  86.         empSuppName  emp.ename%TYPE;
  87.  
  88.       BEGIN
  89.         FOR v_emp IN c_emp LOOP
  90.           SELECT ename INTO empSuppName FROM emp WHERE emp.EMPNO =7902;
  91.           DBMS_OUTPUT.PUT_LINE('Nom : ' || v_emp.ENAME || ' Supérieur : ' || empSuppName);
  92.         END LOOP;
  93.       END;
  94.  
  95.   SELECT * FROM emp;
  96.  
  97.   BEGIN
  98.     empSupp();
  99.   END;
  100.  
  101.  
  102.  
  103.   -- 4
  104.  
  105.    CREATE  OR REPLACE PROCEDURE SALMED (in_id IN NUMBER) IS
  106.      CURSOR c_emp IS SELECT * FROM emp;
  107.      salRef emp.sal%TYPE;
  108.  
  109.     BEGIN
  110.       SELECT sal INTO salRef FROM emp WHERE EMPNO = in_id;
  111.       FOR v_emp IN c_emp LOOP
  112.         IF v_emp.EMPNO <> in_id AND (v_emp.sal + v_emp.COMM > salRef) THEN
  113.           DBMS_OUTPUT.PUT_LINE(v_emp.ENAME || 'gagne plus que ' || in_id);
  114.         END IF;
  115.       END LOOP;
  116.     END;
  117.  
  118.  
  119.   BEGIN
  120.     SALMED(7521);
  121.   END;
  122.  
  123.  
  124.  
  125.  
  126.   -- 5
  127.   -- Le meme job ou un salaire > a l'employé (passé en nom)
  128.  
  129.  
  130.     CREATE  OR REPLACE  PROCEDURE  sameOrMore(in_ename IN emp.ename%TYPE) IS
  131.       CURSOR c_emp IS SELECT * FROM emp;
  132.       jobRef emp.job%TYPE;
  133.       salRef emp.sal%TYPE;
  134.       BEGIN
  135.         SELECT job INTO jobRef FROM emp WHERE ENAME = in_ename;
  136.         SELECT sal INTO salRef FROM emp WHERE ENAME = in_ename;
  137.  
  138.         FOR v_emp IN c_emp LOOP
  139.           IF v_emp.JOB =  jobRef OR v_emp.sal > salRef THEN
  140.             DBMS_OUTPUT.PUT_LINE(v_emp.ENAME);
  141.           END IF;
  142.  
  143.  
  144.         END LOOP;
  145.       END;
  146.  
  147.  
  148.   BEGIN
  149.     sameOrMore('SMITH');
  150.   END;
  151.  
  152.  
  153.   -- 6
  154.   -- Generer la liste des N plus gros salaire
  155.  
  156.       CREATE OR REPLACE PROCEDURE Nbest(in_n IN NUMBER) IS
  157.  
  158.         CURSOR c_emp IS SELECT * FROM emp ORDER BY sal DESC ;
  159.         v_emp emp%ROWTYPE;
  160.         rowCount INTEGER;
  161.         e_notEnoughRow EXCEPTION;
  162.  
  163.       BEGIN
  164.         SELECT COUNT(*) INTO rowCount FROM emp;
  165.         OPEN c_emp;
  166.         IF in_n > rowCount THEN
  167.           RAISE e_notEnoughRow;
  168.         END IF;
  169.         FOR i IN  0..in_n LOOP
  170.           FETCH  c_emp INTO v_emp;
  171.           DBMS_OUTPUT.put_line('Nom : ' ||v_emp.ENAME || '  Sal : '|| v_emp.SAL);
  172.       END LOOP;
  173.         CLOSE c_emp;
  174.  
  175.       EXCEPTION
  176.           WHEN e_notEnoughRow THEN
  177.         DBMS_OUTPUT.PUT_LINE('Erreur : Vous avez demandé trop d employés');
  178.  
  179.  
  180.       END;
  181.  
  182.  
  183.   BEGIN
  184.   NBEST(100);
  185.   END;
  186.  
  187.  
  188. --7
  189. -- Afficher par ordres décroissant les départements sans employé
  190.  
  191.       SELECT COUNT(*) FROM emp GROUP BY DEPTNO;
  192.       SELECT deptno FROM dept;
  193.   CREATE  OR REPLACE  PROCEDURE deptWithoutEmpDesc IS
  194.  
  195.     CURSOR c_dept IS SELECT DEPTNO FROM dept;
  196.     nbEmp INTEGER;
  197.     BEGIN
  198.       FOR v_dept IN c_dept LOOP
  199.         SELECT COUNT(*) INTO nbEmp FROM emp WHERE deptno = v_dept.DEPTNO;
  200.         IF nbEmp = 0 THEN
  201.           DBMS_OUTPUT.PUT_LINE('Le département numéro ' || v_dept.DEPTNO || ' n a pas d employé.');
  202.         END IF;
  203.       END LOOP;
  204.     END;
  205.  
  206.  
  207.  
  208. -- 9
  209. -- Creer une vue donnant la somme des salaires par département
  210.       DECLARE
  211.  
  212.         CURSOR c_emp IS SELECT deptno FROM dept;
  213.         sal emp.sal%TYPE := 0;
  214.         currentMoy emp.sal%TYPE;
  215.       BEGIN
  216.         FOR v_emp IN c_emp LOOP
  217.  
  218.           SELECT SUM(sal) INTO currentMoy FROM emp WHERE deptno = v_emp.DEPTNO;
  219.  
  220.           INSERT INTO dept2 (BUDGET) VALUES (currentMoy) WHERE deptno = v_emp.deptno;
  221.         END LOOP;
  222.  
  223.       END;
  224.  
  225.       SELECT * FROM dept2;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement