Guest User

Untitled

a guest
Jul 21st, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 10.88 KB | None | 0 0
  1. # TP2 PL/SQL
  2.  
  3.  
  4. SET serveroutput ON
  5.  
  6. # Exercice 1
  7.  
  8. CREATE OR REPLACE PROCEDURE DEP_SANS_CHEF(ville IN VARCHAR)
  9. IS
  10.     CURSOR departments
  11.         IS SELECT department_name, department_id FROM hr.departments d, hr.locations l
  12.                     WHERE d.location_id=l.location_id
  13.                     AND d.manager_id IS NULL
  14.                     AND LOWER(l.city)=LOWER(ville);
  15.     nb NUMBER;
  16.     dep departments%ROWTYPE;
  17.     villeInexistante EXCEPTION;
  18.     pasDeDep EXCEPTION;
  19. BEGIN
  20.     SELECT COUNT(*) INTO nb FROM hr.locations WHERE LOWER(city)=LOWER(ville);
  21.     IF nb=0 THEN
  22.         raise villeInexistante;
  23.     END IF;
  24.     SELECT COUNT(*) INTO nb FROM hr.departments d, hr.locations l
  25.                     WHERE d.location_id=l.location_id
  26.                     AND d.manager_id IS NULL
  27.                     AND LOWER(l.city)=LOWER(ville);
  28.     IF nb=0 THEN
  29.         raise pasDeDep;
  30.     END IF;
  31.  
  32.     dbms_output.put_line('Liste des departements sans manager dans la ville de ' || ville || ' :');
  33.     FOR dep IN departments loop
  34.         dbms_output.put_line('    - ' || dep.department_name);
  35.     END loop;
  36. exception
  37.     WHEN villeInexistante THEN
  38.         dbms_output.put_line('Pas de ville ' || ville);
  39.     WHEN pasDeDep THEN
  40.         dbms_output.put_line('Pas de departement sans chef dans la ville de ' || ville);
  41. END;
  42. /
  43.  
  44. EXEC DEP_SANS_CHEF('seattle')
  45. EXEC DEP_SANS_CHEF('southlake')
  46. EXEC DEP_SANS_CHEF('tokyo')
  47. EXEC DEP_SANS_CHEF('roma')
  48.  
  49. Liste des departements sans manager dans la ville de seattle :
  50. - Treasury
  51. - Corporate Tax
  52. - Control AND Credit
  53. - Shareholder Services
  54. - Benefits
  55. - Manufacturing
  56. - Construction
  57. - Contracting
  58. - Operations
  59. - IT Support
  60. - NOC
  61. - IT Helpdesk
  62. - Government Sales
  63. - Retail Sales
  64. - Recruiting
  65. - Payroll
  66.  
  67. Pas de departement sans chef dans la ville de southlake
  68. Pas de departement sans chef dans la ville de tokyo
  69. Pas de departement sans chef dans la ville de roma
  70.  
  71.  
  72. # Exercice 2
  73.  
  74. CREATE OR REPLACE PROCEDURE EFFECTIF_DEP(ville IN VARCHAR)
  75. IS
  76.     CURSOR liste IS SELECT d.department_name, COUNT(*) AS nb_employees FROM hr.departments d, hr.locations l, hr.employees e
  77.             WHERE d.location_id=l.location_id
  78.             AND d.department_id=e.department_id
  79.             AND LOWER(l.city)=LOWER(ville)
  80.             GROUP BY d.department_id, d.department_name;
  81.     dep liste%ROWTYPE;
  82.     villeInexistante EXCEPTION;
  83.     pasDeDep EXCEPTION;
  84.     nb NUMBER;
  85. BEGIN
  86.     SELECT COUNT(*) INTO nb FROM hr.locations WHERE LOWER(city)=LOWER(ville);
  87.     IF nb=0 THEN
  88.         raise villeInexistante;
  89.     END IF;
  90.     SELECT COUNT(*) INTO nb FROM hr.locations l, hr.departments d WHERE l.location_id=d.location_id;
  91.     IF nb=0 THEN
  92.         raise pasDeDep;
  93.     END IF;
  94.     dbms_output.put_line('Effectifs de ' || ville || ' :');
  95.     FOR dep IN liste LOOP
  96.         dbms_output.put_line('    - ' || dep.nb_employees || ' employes dans le departement ' || dep.department_name);
  97.     END LOOP;
  98.  
  99. exception
  100.     WHEN villeInexistante THEN
  101.         dbms_output.put_line('Pas de ville ' || ville);
  102.     WHEN pasDeDep THEN
  103.         dbms_output.put_line('Pas de departement dans la ville de ' || ville);
  104. END;
  105. /
  106.  
  107. EXEC EFFECTIF_DEP('seattle')
  108. EXEC EFFECTIF_DEP('southlake')
  109. EXEC EFFECTIF_DEP('tokyo')
  110. EXEC EFFECTIF_DEP('roma')
  111.  
  112. # Exercice 3
  113.  
  114. DECLARE
  115.     CURSOR employes IS SELECT * FROM hr.employees ORDER BY salary DESC;
  116.     emp employes%ROWTYPE;
  117. BEGIN
  118.     FOR emp IN employes LOOP
  119.         IF employes%ROWCOUNT>=6 THEN
  120.             EXIT;
  121.         ELSE
  122.             dbms_output.put_line(emp.first_name || ' ' || emp.last_name || ' gagne ' || emp.salary || '$');
  123.         END IF;
  124.     END LOOP;
  125. END;
  126. /
  127.  
  128. Steven King gagne 24000$
  129. Neena Kochhar gagne 17000$
  130. Lex De Haan gagne 17000$
  131. John Russell gagne 14000$
  132. Karen Partners gagne 13500$
  133.  
  134. CREATE OR REPLACE PROCEDURE TOP_N(n IN NUMBER)
  135. IS
  136.     CURSOR employes IS SELECT * FROM hr.employees ORDER BY salary DESC;
  137.     emp employes%ROWTYPE;
  138.     nIncorrect EXCEPTION;
  139. BEGIN
  140.     IF n<=0 THEN
  141.         RAISE nIncorrect;
  142.     END IF;
  143.  
  144.     FOR emp IN employes LOOP
  145.         IF employes%ROWCOUNT>n THEN
  146.             EXIT;
  147.         ELSE
  148.             dbms_output.put_line(emp.first_name || ' ' || emp.last_name || ' gagne ' || emp.salary || '$');
  149.         END IF;
  150.     END LOOP;
  151. EXCEPTION
  152.     WHEN nIncorrect THEN
  153.         dbms_output.put_line('n negatif ou nul');
  154. END;
  155. /
  156.  
  157. EXEC TOP_N(5)
  158.  
  159. Steven King gagne 24000$
  160. Neena Kochhar gagne 17000$
  161. Lex De Haan gagne 17000$
  162. John Russell gagne 14000$
  163. Karen Partners gagne 13500$
  164.  
  165. EXEC TOP_N(-10)
  166.  
  167. n negatif ou nul
  168.  
  169. EXEC TOP_N(11)
  170.  
  171. Steven King gagne 24000$
  172. Neena Kochhar gagne 17000$
  173. Lex De Haan gagne 17000$
  174. John Russell gagne 14000$
  175. Karen Partners gagne 13500$
  176. Michael Hartstein gagne 13000$
  177. Shelley Higgins gagne 12000$
  178. Nancy Greenberg gagne 12000$
  179. Alberto Errazuriz gagne 12000$
  180. Lisa Ozer gagne 11500$
  181. Gerald Cambrault gagne 11000$
  182.  
  183. CREATE OR REPLACE PROCEDURE TOP_N_BIS(n IN NUMBER)
  184. IS
  185.     CURSOR employes IS SELECT * FROM hr.employees ORDER BY salary DESC;
  186.     emp employes%ROWTYPE;
  187.     i NUMBER := 0;
  188.     dernierSalaire hr.employees.salary%TYPE := -1;
  189.     nIncorrect EXCEPTION;
  190. BEGIN
  191.     IF n<=0 THEN
  192.         RAISE nIncorrect;
  193.     END IF;
  194.  
  195.     FOR emp IN employes LOOP
  196.         IF i>=n THEN
  197.             EXIT;
  198.         ELSE
  199.             IF dernierSalaire != emp.salary THEN
  200.                 i := i + 1;
  201.                 dernierSalaire := emp.salary;
  202.             END IF;
  203.             dbms_output.put_line(i ||') '||emp.first_name || ' ' || emp.last_name || ' gagne ' || emp.salary || '$');
  204.         END IF;
  205.     END LOOP;
  206. EXCEPTION
  207.     WHEN nIncorrect THEN
  208.         dbms_output.put_line('n negatif ou nul');
  209. END;
  210. /
  211.  
  212. EXEC TOP_N_BIS(5)
  213.  
  214. 1) Steven King gagne 24000$
  215. 2) Neena Kochhar gagne 17000$
  216. 2) Lex De Haan gagne 17000$
  217. 3) John Russell gagne 14000$
  218. 4) Karen Partners gagne 13500$
  219. 5) Michael Hartstein gagne 13000$
  220.  
  221. EXEC TOP_N_BIS(7)
  222. 1) Steven King gagne 24000$
  223. 2) Neena Kochhar gagne 17000$
  224. 2) Lex De Haan gagne 17000$
  225. 3) John Russell gagne 14000$
  226. 4) Karen Partners gagne 13500$
  227. 5) Michael Hartstein gagne 13000$
  228. 6) Shelley Higgins gagne 12000$
  229. 6) Nancy Greenberg gagne 12000$
  230. 6) Alberto Errazuriz gagne 12000$
  231. 7) Lisa Ozer gagne 11500$
  232.  
  233.  
  234. EXEC TOP_N_BIS(11)
  235.  
  236. 1) Steven King gagne 24000$
  237. 2) Neena Kochhar gagne 17000$
  238. 2) Lex De Haan gagne 17000$
  239. 3) John Russell gagne 14000$
  240. 4) Karen Partners gagne 13500$
  241. 5) Michael Hartstein gagne 13000$
  242. 6) Shelley Higgins gagne 12000$
  243. 6) Nancy Greenberg gagne 12000$
  244. 6) Alberto Errazuriz gagne 12000$
  245. 7) Lisa Ozer gagne 11500$
  246. 8) Gerald Cambrault gagne 11000$
  247. 8) Ellen Abel gagne 11000$
  248. 8) Den Raphaely gagne 11000$
  249. 9) Clara Vishney gagne 10500$
  250. 9) Eleni Zlotkey gagne 10500$
  251. 10) Harrison Bloom gagne 10000$
  252. 10) Janette King gagne 10000$
  253. 10) Peter Tucker gagne 10000$
  254. 10) Hermann Baer gagne 10000$
  255. 11) Tayler Fox gagne 9600$
  256.  
  257.  
  258. DECLARE
  259.     CURSOR topEmp IS SELECT * FROM hr.employees ORDER BY salary DESC;
  260.     CURSOR jobHist(empId hr.employees.employee_id%TYPE) IS SELECT *
  261.                                 FROM hr.jobs NATURAL JOIN hr.job_history
  262.                                 WHERE employee_id=empId
  263.                                 ORDER BY start_date DESC;
  264.     emp topEmp%ROWTYPE;
  265.     job jobHist%ROWTYPE;
  266.  
  267. BEGIN
  268.     FOR emp IN topEmp LOOP
  269.         IF topEmp%ROWCOUNT>=6 THEN
  270.             EXIT;
  271.         ELSE
  272.             dbms_output.put_line('Historique de ' || emp.first_name || ' ' || emp.last_name || ' :');
  273.             FOR job IN jobHist(emp.employee_id) LOOP
  274.                 IF jobHist%ROWCOUNT>=4 THEN
  275.                     EXIT;
  276.                 ELSE
  277.                     dbms_output.put_line(   '    - '                                ||
  278.                                             to_char(job.start_date, 'dd/mm/yyyy')   ||
  279.                                             ' -> '                                  ||
  280.                                             to_char(job.end_date, 'dd/mm/yyyy')     ||
  281.                                             ' : '                                   ||
  282.                                             job.job_title
  283.                                         );
  284.                 END IF;
  285.             END LOOP;
  286.         END IF;
  287.     END LOOP;
  288. END;
  289. /
  290.  
  291. Historique de Steven King :
  292. Historique de Neena Kochhar :
  293. - 28/10/1993 -> 15/03/1997 : Accounting Manager
  294. - 21/09/1989 -> 27/10/1993 : Public Accountant
  295. Historique de Lex De Haan :
  296. - 13/01/1993 -> 24/07/1998 : Programmer
  297. Historique de John Russell :
  298. Historique de Karen Partners :
  299.  
  300.  
  301.  
  302. SELECT COUNT(*) AS nb_subalternes FROM hr.employees
  303.                 WHERE manager_id=100;
  304.  
  305. CREATE OR REPLACE FUNCTION NB_SUBALTERNES_DIRECTS(id hr.employees.employee_id%TYPE)
  306. RETURN NUMBER
  307. IS
  308.     nb NUMBER;
  309.     idIncorrecte EXCEPTION;
  310. BEGIN
  311.     SELECT COUNT(*) INTO nb FROM hr.employees WHERE employee_id=id;
  312.     IF nb=0 OR id IS NULL THEN
  313.         RAISE idIncorrecte;
  314.     END IF;
  315.     SELECT COUNT(*) INTO nb FROM hr.employees WHERE manager_id=id;
  316.     RETURN nb;
  317.  
  318. EXCEPTION
  319.     WHEN idIncorrecte THEN
  320.         dbms_output.put_line('ID incorrecte ou non indiquee');
  321. END;
  322. /
  323.  
  324. NB_SUBALTERNES_DIRECTS(100)
  325. ---------------------------
  326.              14
  327.  
  328.  
  329. SELECT employee_id, NB_SUBALTERNES_DIRECTS(employee_id) FROM hr.employees;
  330.  
  331. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  332. ----------- -----------------------------------
  333.     100                  14
  334.     101                   5
  335.     102                   1
  336.     103                   4
  337.     104                   0
  338.     105                   0
  339.     106                   0
  340.     107                   0
  341.     108                   5
  342.     109                   0
  343.     110                   0
  344.  
  345. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  346. ----------- -----------------------------------
  347.     111                   0
  348.     112                   0
  349.     113                   0
  350.     114                   5
  351.     115                   0
  352.     116                   0
  353.     117                   0
  354.     118                   0
  355.     119                   0
  356.     120                   8
  357.     121                   8
  358.  
  359. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  360. ----------- -----------------------------------
  361.     122                   8
  362.     123                   8
  363.     124                   8
  364.     125                   0
  365.     126                   0
  366.     127                   0
  367.     128                   0
  368.     129                   0
  369.     130                   0
  370.     131                   0
  371.     132                   0
  372.  
  373. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  374. ----------- -----------------------------------
  375.     133                   0
  376.     134                   0
  377.     135                   0
  378.     136                   0
  379.     137                   0
  380.     138                   0
  381.     139                   0
  382.     140                   0
  383.     141                   0
  384.     142                   0
  385.     143                   0
  386.  
  387. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  388. ----------- -----------------------------------
  389.     144                   0
  390.     145                   6
  391.     146                   6
  392.     147                   6
  393.     148                   6
  394.     149                   6
  395.     150                   0
  396.     151                   0
  397.     152                   0
  398.     153                   0
  399.     154                   0
  400.  
  401. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  402. ----------- -----------------------------------
  403.     155                   0
  404.     156                   0
  405.     157                   0
  406.     158                   0
  407.     159                   0
  408.     160                   0
  409.     161                   0
  410.     162                   0
  411.     163                   0
  412.     164                   0
  413.     165                   0
  414.  
  415. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  416. ----------- -----------------------------------
  417.     166                   0
  418.     167                   0
  419.     168                   0
  420.     169                   0
  421.     170                   0
  422.     171                   0
  423.     172                   0
  424.     173                   0
  425.     174                   0
  426.     175                   0
  427.     176                   0
  428.  
  429. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  430. ----------- -----------------------------------
  431.     177                   0
  432.     178                   0
  433.     179                   0
  434.     180                   0
  435.     181                   0
  436.     182                   0
  437.     183                   0
  438.     184                   0
  439.     185                   0
  440.     186                   0
  441.     187                   0
  442.  
  443. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  444. ----------- -----------------------------------
  445.     188                   0
  446.     189                   0
  447.     190                   0
  448.     191                   0
  449.     192                   0
  450.     193                   0
  451.     194                   0
  452.     195                   0
  453.     196                   0
  454.     197                   0
  455.     198                   0
  456.  
  457. EMPLOYEE_ID NB_SUBALTERNES_DIRECTS(EMPLOYEE_ID)
  458. ----------- -----------------------------------
  459.     199                   0
  460.     200                   0
  461.     201                   1
  462.     202                   0
  463.     203                   0
  464.     204                   0
  465.     205                   1
  466.     206                   0
Add Comment
Please, Sign In to add comment