Advertisement
Teorema

Untitled

Jun 9th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 9.88 KB | None | 0 0
  1. /*INIZIO DESCRIZIONE ED IMPLEMENTAZIONE DI VINCOLI*/
  2.  
  3. /*AUTOMAZIONI PK ATTENZIONE: FORSE QUESTA PARTE QUI ANDREBBE NELLA DEFINIZIONE DELLE TABELLE, A PREFERENZA DEL PROF*/
  4.  
  5. --TABELLA Relazione
  6. --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Relazione
  7. --la quale verrà incrementata di una in un'unità per ogni insert
  8. CREATE OR REPLACE TRIGGER auto_RelazionePK
  9. BEFORE INSERT ON Relazione
  10. FOR EACH ROW
  11. BEGIN
  12.     :NEW.CodRel := relazione_auto_inc.NEXTVAL;
  13. END;
  14. /
  15. --Sequenza affiancata al trigger auto_RelazionePK
  16. CREATE SEQUENCE relazione_auto_inc INCREMENT BY 1 START WITH 1;
  17. /
  18.  
  19.  
  20.  
  21.  
  22. --TABELLA Attributo
  23. --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Attributo
  24. --la quale verrà incrementata di una in un'unità per ogni insert
  25. CREATE OR REPLACE TRIGGER auto_AttributoPK
  26. BEFORE INSERT ON Attributo
  27. FOR EACH ROW
  28. BEGIN
  29.     :NEW.codAtt := attributo_auto_inc.NEXTVAL;
  30. END;
  31. /
  32. --Sequenza affiancata al trigger auto_AttributoPK
  33. CREATE SEQUENCE attributo_auto_inc INCREMENT BY 1 START WITH 1;
  34. /
  35.  
  36.  
  37.  
  38.  
  39. --TABELLA Class Diagram
  40. --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Class Diagram
  41. --la quale verrà incrementata di una in un'unità per ogni insert
  42. CREATE OR REPLACE TRIGGER auto_ClassDiagramPK
  43. BEFORE INSERT ON Class Diagram
  44. FOR EACH ROW
  45. BEGIN
  46.     :NEW.codCD := attributo_auto_inc.NEXTVAL;
  47. END;
  48. /
  49. --Sequenza affiancata al trigger auto_ClassDiagramPK
  50. CREATE SEQUENCE attributo_auto_inc INCREMENT BY 1 START WITH 1;
  51. /
  52.  
  53.  
  54.  
  55.  
  56. --TABELLA Metodo
  57. --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Metodo
  58. --la quale verrà incrementata di una in un'unità per ogni insert
  59. CREATE OR REPLACE TRIGGER auto_MetodoPK
  60. BEFORE INSERT ON Metodo
  61. FOR EACH ROW
  62. BEGIN
  63.     :NEW.codM := metodo_auto_inc.NEXTVAL;
  64. END;
  65. /
  66. --Sequenza affiancata al trigger auto_MetodoPK
  67. CREATE SEQUENCE metodo_auto_inc INCREMENT BY 1 START WITH 1;
  68. /
  69.  
  70.  
  71.  
  72.  
  73. --TABELLA Parametro
  74. --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Parametro
  75. --la quale verrà incrementata di una in un'unità per ogni insert
  76. CREATE OR REPLACE TRIGGER auto_ParametroPK
  77. BEFORE INSERT ON Parametro
  78. FOR EACH ROW
  79. BEGIN
  80.     :NEW.codP:= parametro_auto_inc.NEXTVAL;
  81. END;
  82. /
  83. --Sequenza affiancata al trigger auto_ParametroPK
  84. CREATE SEQUENCE parametro_auto_inc INCREMENT BY 1 START WITH 1;
  85. /
  86.  
  87.  
  88.  
  89.  
  90. --TABELLA Partecipa
  91. --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Partecipa
  92. --la quale verrà incrementata di una in un'unità per ogni insert
  93. CREATE OR REPLACE TRIGGER auto_PartecipaPK
  94. BEFORE INSERT ON Partecipa
  95. FOR EACH ROW
  96. BEGIN
  97.     :NEW.codPartecip:= partecipa_auto_inc.NEXTVAL;
  98. END;
  99. /
  100. --Sequenza affiancata al trigger auto_PartecipaPK
  101. CREATE SEQUENCE partecipa_auto_inc INCREMENT BY 1 START WITH 1;
  102. /
  103.  
  104.  
  105.  
  106.  
  107. --TABELLA Classe
  108. --Questo trigger, coadiuvandosi con la sequenza, fornisce un'automazione per la Primary Key della tabella Classe
  109. --la quale verrà incrementata di una in un'unità per ogni insert
  110. CREATE OR REPLACE TRIGGER auto_ClassePK
  111. BEFORE INSERT ON Classe
  112. FOR EACH ROW
  113. BEGIN
  114.     :NEW.codClasse:= classe_auto_inc.NEXTVAL;
  115. END;
  116. /
  117. --Sequenza affiancata al trigger auto_ClassePK
  118. CREATE SEQUENCE classe_auto_inc INCREMENT BY 1 START WITH 1;
  119. /
  120.  
  121. /*FINE AUTOMAZIONI PK*/
  122.  
  123. /*INIZIO DEI VINCOLI VERI E PROPRI MEDIANTE TRIGGER E FUNZIONI*/
  124.  
  125.  
  126.  
  127. --Si è impiegata la seguente vista per alcuni vincoli:
  128. CREATE OR REPLACE VIEW NomiClassi (CodCD, Nome_Classe) AS
  129.     SELECT CD.codCD, cl.Nome
  130.     FROM Classe cl JOIN ClassDiagram CD ON cl.codCD = CD.codCD;
  131.  
  132.  
  133.  
  134.  
  135.  
  136. --VINCOLO TABELLA PARTECIPA: 'MOLTEPLICITA' CONFORME ALLE REGOLE UML'
  137. --Questa funzione prende in input un parametro varchar e restituisce 't' (true) se esso è conforme alla scrittura
  138. --di moltiplicità in un diagramma UML. Infatti la molteplicità deve necessariamente avere una delle seguenti forme:
  139. --'n..m' (per ogni n>=0, m > 0 e n<m)
  140. --'*' (dove * è esattamente il carattere *)
  141. --'n..*' (per ogni n>=0 e * è esattamente il carattere *)
  142. --'n' (per ogni numero naturale strettamente positivo)
  143. CREATE OR REPLACE FUNCTION moltepl_valido(mol VARCHAR2) RETURN CHAR IS
  144. BEGIN
  145.  
  146.     IF regexp_like(mol, '\d+\.\.\d+$') AND
  147.     TO_NUMBER(regexp_substr(mol,'\d+', 1, 2)) > TO_NUMBER(regexp_substr(mol,'\d+', 1, 1))
  148.     THEN
  149.         RETURN 't';
  150.        
  151.     ELSIF regexp_like(mol, '^\d+$')
  152.         AND TO_NUMBER(regexp_substr(mol,'\d+')) > 0 THEN
  153.         RETURN 't';
  154.        
  155.     ELSIF regexp_like(LOWER(mol), '(^\d+)\.\.\*$|^\*$') THEN
  156.         RETURN 't';
  157.    
  158.     ELSE
  159.         RETURN 'f';
  160.     END IF;
  161.    
  162. END;
  163. /
  164.  
  165. --Il seguente trigger fornisce un'implementazione per il vincolo 'Molteplicità conforme ad UML' usufruendo della funzione moltepl_valido appena descritta
  166. CREATE OR REPLACE TRIGGER dominioMoltepl_Partecipa
  167. BEFORE INSERT OR UPDATE ON Partecipa
  168. FOR EACH ROW
  169. BEGIN
  170.     IF moltepl_valido (:NEW.molteplicità) = 'f' THEN --se la funzione restituisce 'f' (false) vuol dire che...
  171.         RAISE_APPLICATION_ERROR (-20002, 'Scrittura della molteplicità non conforme alle regole UML'); -- ...la stringa non è conforme
  172.     END IF;
  173. END;
  174. /
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181. --VINCOLO TABELLA ATTRIBUTO: IL TIPO DI UN ATTRIBUTO DEVE ESSERE UN TIPO PRIMITIVO OPPURE (XOR) UNA CLASSE DELLO STESSO CLASS DIAGRAM
  182. --Nota: le query sono tutte commentate e seguono precisamente il flusso solito in cui verrebbe letto prima il from, poi il where ed infine il select
  183. CREATE OR REPLACE FUNCTION tipoValido (tipo VARCHAR2, cd ClassDiagram.codCD%TYPE) RETURN CHAR IS
  184. corrispondenze int; --variabile locale che conta il numero di record soddisfacenti la query
  185. BEGIN
  186.     --verifica se il tipo è primitivo
  187.     SELECT COUNT(*) INTO corrispondenze -- ...ed inserisci il numero di corrispondenze trovate nella variabile locale
  188.     FROM Basictype --Prendi la tabella Basictype contenente i tipi primitivi UML...
  189.     WHERE nome = LOWER (tipo); -- ...selezione i record in cui il tipo passato come parametro è uguale ad uno dei basictypes...
  190.    
  191.     --se hai trovato almeno una corrispondenza, restituisci vero in quanto il tipo passato come parametro è primitivo
  192.     IF corrispondenze > 0 THEN
  193.         RETURN 't';
  194.     END IF;
  195.  
  196.     --altrimenti, verifica se il tipo passato come parametro è una classe dello stesso class diagram
  197.     SELECT COUNT(*) INTO corrispondenze -- ...ed inserisci il numero di corrispondenze trovate nella variabile locale
  198.     FROM nomiClassi nCl --Prendi la vista precedentemente costruita chiamata NomiClassi...
  199.     WHERE nCl.nome_classe = tipo AND nCl.codCD = cd; -- ...seleziona i record in cui c'è una corrispondenza tra il tipo passato come parametro ed i nomi delle classi in uno specifico class diagram (quello passato come parametro)...
  200.  
  201.     --se hai trovato almeno una corrispondenza, restituisci vero in quanto il tipo pur non essendo primitivo, è una classe di un cd
  202.     IF corrispondenze > 0 THEN
  203.         RETURN 't';
  204.     ELSE --altrimenti restituisci falso
  205.         RETURN 'f';
  206.     END IF;
  207.  
  208. END; --fine della funzione
  209. /
  210.  
  211. --Il seguente trigger fornisce un'implementazione per il vincolo 'IL TIPO DI UN ATTRIBUTO DEVE ESSERE UN TIPO PRIMITIVO OPPURE (XOR) UNA CLASSE DELLO STESSO CLASS DIAGRAM' usufruendo della funzione tipoValido appena descritta
  212. CREATE OR REPLACE TRIGGER dominioTipo_Attributo
  213. BEFORE INSERT OR UPDATE ON Attributo
  214. FOR EACH ROW
  215. BEGIN
  216. DECLARE
  217.     cd ClassDiagram.codCD%TYPE;
  218.     BEGIN
  219.         SELECT cd.codCD INTO cd
  220.         FROM Classe cl JOIN ClassDiagram cd ON cl.codCD = cd.codCD
  221.         WHERE cl.codClasse = :NEW.codCl;
  222.  
  223.         IF tipoValido (:NEW.Tipo, cd) = 'f' THEN
  224.             RAISE_APPLICATION_ERROR (-20002, 'Tipo non valido');
  225.         END IF;
  226.     END;
  227. END;
  228. /
  229.  
  230.  
  231.  
  232.  
  233.  
  234. --VINCOLO TABELLA PARAMETRO: IL TIPO DI UN PARAMETRO DEVE ESSERE UN TIPO PRIMITIVO OPPURE (XOR) UNA CLASSE DELLO STESSO CLASS DIAGRAM
  235. --Scriviamo direttamente il trigger che utilizzerà la funzione già descritta
  236. CREATE OR REPLACE TRIGGER dominioTipo_Parametro
  237. BEFORE INSERT OR UPDATE ON Parametro
  238. FOR EACH ROW
  239. BEGIN
  240. DECLARE
  241.     cd ClassDiagram.codCD%TYPE;
  242.     BEGIN
  243.         SELECT cd.codCD INTO cd
  244.         --metodi e parametri di una classe di uno stesso class diagram
  245.         FROM (Metodo m JOIN classe cl ON m.codCl = cl.CodClasse) JOIN ClassDiagram cd ON cl.codCD = cd.codCD
  246.         WHERE m.codM = :NEW.codMetodo;
  247.        
  248.         IF tipoValido (:NEW.Tipo, cd) = 'f' THEN
  249.             RAISE_APPLICATION_ERROR (-20002, 'Tipo non valido');
  250.         END IF;
  251.     END;
  252. END;
  253. /
  254.  
  255.  
  256.  
  257.  
  258.  
  259. --VINCOLO TABELLA METODO: IL TIPO DI UN METODO DEVE ESSERE UN TIPO PRIMITIVO OPPURE (XOR) UNA CLASSE DELLO STESSO CLASS DIAGRAM
  260. --Scriviamo direttamente il trigger che utilizzerà la funzione già descritta
  261. CREATE OR REPLACE TRIGGER dominioTipoOut_Metodo
  262. BEFORE INSERT OR UPDATE ON Metodo
  263. FOR EACH ROW
  264. BEGIN
  265. DECLARE
  266.     cd ClassDiagram.codCD%TYPE;
  267.     BEGIN
  268.         SELECT cd.codCD INTO cd
  269.         FROM Classe cl JOIN ClassDiagram cd ON cl.codCD = cd.codCD
  270.         WHERE cl.codClasse = :NEW.codCl;
  271.    
  272.         IF tipoValido (:NEW.Tipo, cd) = 'f' THEN
  273.             RAISE_APPLICATION_ERROR (-20002, 'Tipo non valido');
  274.         END IF;
  275.     END;
  276. END;
  277. /
  278.  
  279.  
  280.  
  281.  
  282.  
  283. --VINCOLO TABELLA PARTECIPA: SE IL RUOLO DI UN'ISTANZA DI CLASSE E' 'COMPONENTE', ALLORA LA MOLTEPLICITA' DEVE ESSERE '1'
  284. CREATE OR REPLACE TRIGGER vincolo_molteplicità_classe_componente
  285. BEFORE INSERT ON Partecipa
  286. FOR EACH ROW
  287. BEGIN
  288.     --se il ruolo è 'compone', la molteplicità deve essere 1
  289.     IF LOWER (:NEW.Ruolo) = 'compone' THEN
  290.         --se si cerca di inserire una molteplicità diversa da 1 in un record il cui ruolo è compone, lancia un errore
  291.         IF :NEW.Molteplicità <> '1' THEN
  292.             RAISE_APPLICATION_ERROR (-20002, 'La molteplicità di una classe componente deve essere 1');
  293.         --altrimenti, imposta in automatico che la molteplicità sia '1'
  294.         ELSE
  295.             :NEW.Molteplicità := '1'; --ricordiamoci che la molteplicità è dichiarata varchar per motivi discussi più su
  296.         END IF;
  297.     END;
  298. END;
  299. /
  300.  
  301. /*FINE DESCRIZIONE ED IMPLEMENTAZIONE DI VINCOLI*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement