Advertisement
JosepRivaille

BD - REPÀS: Procedures

Apr 30th, 2016
518
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- 1)
  2.  
  3. CREATE TYPE empl AS
  4. ( nom char(30),
  5.   sou integer);
  6.  
  7. CREATE OR REPLACE FUNCTION empl_departament(numdept integer) RETURNS SETOF empl AS $$
  8. DECLARE
  9.   e empl;
  10.   missatge VARCHAR(50);
  11.   quants INTEGER;
  12.   count INTEGER;
  13.  
  14. BEGIN
  15.  
  16.   count = 0;
  17.  
  18.   FOR e IN SELECT nom_empl, sou FROM empleats em WHERE em.num_dpt = numdept AND em.ciutat_empl = 'SITGES'
  19.      LOOP
  20.         count = count + 1;
  21.         RETURN NEXT e;
  22.      END LOOP;
  23.  
  24.   IF count = 0 THEN
  25.         SELECT texte INTO missatge FROM missatgesExcepcions WHERE num=1;
  26.         RAISE EXCEPTION '%', missatge;
  27.   END IF;
  28.  
  29.   RETURN;
  30.  
  31.   EXCEPTION
  32.      WHEN raise_exception THEN
  33.     RAISE EXCEPTION '%', missatge;
  34.      WHEN OTHERS THEN
  35.         SELECT texte INTO missatge FROM missatgesExcepcions WHERE num=2;
  36.         RAISE EXCEPTION '%', missatge;
  37.  
  38. END;
  39. $$LANGUAGE plpgsql;
  40.  
  41. -- 2)
  42.  
  43. CREATE OR REPLACE FUNCTION eliminar_dept(numdept INTEGER) RETURNS void AS $$
  44. DECLARE
  45.    missatge VARCHAR(50);
  46.  
  47. BEGIN
  48.  
  49.      IF EXISTS (SELECT * FROM empleats em WHERE em.num_dpt = numdept) THEN
  50.       SELECT texte INTO missatge FROM missatgesExcepcions WHERE num=1;
  51.       RAISE EXCEPTION '%',missatge;
  52.      END IF;
  53.  
  54.      DELETE FROM departaments WHERE num_dpt = numdept;
  55.  
  56.      IF NOT FOUND THEN
  57.        SELECT texte INTO missatge FROM missatgesExcepcions WHERE num=2;
  58.            RAISE EXCEPTION '%',missatge;
  59.      END IF;
  60.  
  61. EXCEPTION
  62.    WHEN raise_exception THEN
  63.            RAISE EXCEPTION '%',SQLERRM;
  64.    WHEN OTHERS THEN
  65.            SELECT texte INTO missatge FROM missatgesExcepcions WHERE num=3;
  66.            RAISE EXCEPTION '%',missatge;
  67.  
  68. END;
  69. $$LANGUAGE plpgsql;
  70.  
  71. -- 3)
  72.  
  73. CREATE TYPE dades_treb AS(
  74.     t_dni CHAR(8),
  75.     t_nom_treb CHAR(30),
  76.     t_sou_base REAL,
  77.     t_plus_sou REAL,
  78.     t_matricula CHAR(10)
  79. );
  80.  
  81. CREATE OR REPLACE FUNCTION llistat_treb(dni_min CHAR(8), dni_max CHAR(8)) RETURNS SETOF dades_treb AS $$
  82. DECLARE
  83.     missatge VARCHAR(50);
  84.     wd dades_treb;
  85.     t treballadors;
  86.     l CHAR(10);
  87. BEGIN
  88.     IF NOT EXISTS (SELECT * FROM treballadors treb WHERE treb.dni >= dni_min AND treb.dni <= dni_max) THEN
  89.     SELECT texte INTO missatge FROM missatgesExcepcions WHERE num = 1;
  90.     RAISE EXCEPTION '%', missatge;
  91.     END IF;
  92.     FOR t IN SELECT * FROM treballadors treb WHERE treb.dni >= dni_min AND treb.dni <= dni_max
  93.     LOOP
  94.         SELECT t.dni, t.nom, t.sou_base, t.plus INTO wd.t_dni, wd.t_nom_treb, wd.t_sou_base, wd.t_plus_sou;
  95.         SELECT NULL INTO wd.t_matricula;
  96.         IF 5 <= (SELECT COUNT(*) FROM lloguers_actius la WHERE wd.t_dni = la.dni) THEN
  97.             FOR l IN SELECT matricula FROM lloguers_actius la WHERE wd.t_dni = la.dni
  98.             LOOP
  99.                 SELECT l INTO wd.t_matricula;
  100.                 RETURN NEXT wd;
  101.             END LOOP;
  102.            
  103.         ELSE RETURN NEXT wd;
  104.            
  105.         END IF;
  106.  
  107.     END LOOP;
  108.    
  109.     EXCEPTION
  110.     WHEN raise_exception THEN
  111.         RAISE EXCEPTION '%', missatge;
  112.     WHEN others THEN
  113.         SELECT texte INTO missatge FROM missatgesExcepcions WHERE num = 2;
  114.         RAISE EXCEPTION '%', missatge;
  115. END;
  116. $$LANGUAGE plpgsql;
  117. -- 4)
  118.  
  119. CREATE OR REPLACE FUNCTION assignar_individual(nom CHAR(10), esport CHAR(10)) RETURNS void AS $$
  120. DECLARE
  121.     missatge VARCHAR(50);
  122.     nhomes INTEGER;
  123.     ndones INTEGER;
  124. BEGIN
  125.     IF EXISTS (SELECT * FROM socisclubs WHERE nclub = esport AND nsoci = nom) THEN
  126.         SELECT texte INTO missatge FROM missatgesExcepcions WHERE num = 3;
  127.         RAISE EXCEPTION '%', missatge;
  128.     END IF;
  129.     IF NOT EXISTS (SELECT * FROM socis WHERE nom = nsoci) OR NOT EXISTS (SELECT * FROM clubs WHERE nclub = esport) THEN
  130.         SELECT texte INTO missatge FROM missatgesExcepcions WHERE num = 4;
  131.         RAISE EXCEPTION '%', missatge;
  132.     END IF;
  133.     IF 10 = (SELECT COUNT(*) FROM socisclubs WHERE nclub = esport) THEN
  134.         SELECT texte INTO missatge FROM missatgesExcepcions WHERE num = 1;
  135.         RAISE EXCEPTION '%', missatge;
  136.     END IF;
  137.     nhomes = (SELECT COUNT(*) FROM socisclubs sc, socis s WHERE sc.nclub = esport
  138.                                 AND sc.nsoci = s.nsoci
  139.                                 AND s.sexe = 'M');
  140.     ndones = (SELECT COUNT(*) FROM socisclubs sc, socis s WHERE sc.nclub = esport
  141.                                 AND sc.nsoci = s.nsoci
  142.                                 AND s.sexe = 'F');
  143.     IF nhomes = ndones THEN
  144.         IF 'M' = (SELECT sexe FROM socis s WHERE s.nsoci = nom) THEN
  145.             SELECT texte INTO missatge FROM missatgesExcepcions WHERE num = 2;
  146.             RAISE EXCEPTION '%', missatge;
  147.         END IF;
  148.     END IF;
  149.  
  150.     --Insert if there's no fail
  151.     INSERT INTO socisclubs VALUES(nom, esport);
  152.     IF 6 = (SELECT COUNT(*) FROM socisclubs sc WHERE esport = sc.nclub) THEN
  153.         INSERT INTO clubs_amb_mes_de_5_socis VALUES(esport);
  154.     END IF;
  155.     --
  156.  
  157.     EXCEPTION
  158.         WHEN raise_exception THEN
  159.             RAISE EXCEPTION '%', missatge;
  160.         WHEN OTHERS THEN
  161.             SELECT texte INTO missatge FROM missatgesExcepcions WHERE num = 6;
  162.             RAISE EXCEPTION '%', missatge;
  163.            
  164. END;
  165. $$LANGUAGE plpgsql;
  166.  
  167. -- JosepRivaille
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement