PDA

Visualizza la versione completa : [ORACLE] Gestione attributi derivati


eldivino87
08-04-2009, 16:03
Sto facendo un progetto per l'universita per la gestione di una concessionaria. Per gestire i vincoli di integrità dinamici dobbiamo utilizzare i trigger in Oracle 10g

VINCOLO D'INTEGRITA:
Se il numero di rate è:
- compreso tra 12 e 24, allora il tasso di interesse sarà pari al 5%
- compreso tra 24 e 48, allora il tasso di interesse sarà pari al 7%
- superiore a 48, allora il tasso di interesse sarà pari al 9%

ENTITA RATEIZZAZIONE: (è composta da questi campi)
CODICE
CODICE_SOCIETA_FINANZIARIA
TASSO_D_INTERESSE
NUMERO_RATE



Questo è il codice per la creazione di RATEIZZAZIONE


CREATE TABLE RATEIZZAZIONE (
CODICE VARCHAR2(7) CONSTRAINT PK_RATEIZZAZIONE PRIMARY KEY,
CODICE_SOCIETA_FINANZIARIA VARCHAR2(7) NOT NULL,
TASSO_D_INTERESSE NUMBER CHECK (TASSO_D_INTERESSE BETWEEN 5 AND 10),
NUMERO_RATE NUMBER CHECK (NUMERO_RATE BETWEEN 12 AND 61),
CONSTRAINT FK_RATEIZZAZIONE_PAGAMENTO FOREIGN KEY (CODICE) REFERENCES PAGAMENTO(CODICE),
CONSTRAINT FK_RATEIZZAZIONE_FINANZIARIA FOREIGN KEY (CODICE_SOCIETA_FINANZIARIA) REFERENCES SOCIETA_FINANZIARIA(CODICE)
);


questo è il codice per il popolamento di RATEIZZAZIONE


INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM00','SOFIN00',12);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM01','SOFIN00',24);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM02','SOFIN01',36);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM03','SOFIN01',24);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM04','SOFIN02',60);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM05','SOFIN03',60);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM06','SOFIN04',48);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM07','SOFIN05',36);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM08','SOFIN06',24);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM09','SOFIN07',12);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM10','SOFIN08',24);
INSERT INTO RATEIZZAZIONE(CODICE,CODICE_SOCIETA_FINANZIARIA,NU MERO_RATE) VALUES
('PAGAM11','SOFIN09',12);



Ieri andai dal prof per avere delucidazioni in merito, mi dettò il seguente trigger:


CREATE OR REPLACE TRIGGER TRIGGER_RATE
AFTER INSERT ON RATEIZZAZIONE
FOR EACH ROW
BEGIN
SELECT NUMERO_RATE FROM RATEIZZAZIONE;
IF (:NEW.NUMERO_RATE>11 AND :NEW.NUMERO_RATE<25) THEN
:NEW.TASSO_D_INTERESSE:=5;
END IF;
END;
/






Praticamente, noi popoliamo la tabella RATEIZZAZIONE, rimanendo NULL il campo TASSO D'INTERESSE. Vorremmo che il trigger modificasse quel campo (tasso_d_interesse) in base al valore del campo NUMERO RATE (cioe andando a modificare il "null" e mettendoci i valori 5, 7 o 9). Cioe vorremmo che popolasse il campo TASSO_D_INTERESSE della tabella RATEIZZAZIONE.

xxxAlex83xxx
08-04-2009, 23:12
Io farei così, ma è da verificare



CREATE OR REPLACE TRIGGER TRIGGER_RATE
AFTER INSERT ON RATEIZZAZIONE
FOR EACH ROW
BEGIN
SELECT NUMERO_RATE FROM RATEIZZAZIONE;
IF (:NEW.NUMERO_RATE>11 AND :NEW.NUMERO_RATE<25) THEN
UPDATE RATEIZZAZIONE
SET TASSO_D_INTERESSE = 5
WHERE CODICE = :NEW.CODICE
END IF;
END;
/



Come avevi proposto tu andavi a modificare il valore dell'attributo di bind :NEW.TASSO_D_INTERESSE, ma non lo rendevi persistente sulla tabella. Forse avrebbe potuto funzionare se tu avessi usato un trigger before piuttosto che after.
Al limite prova entrambe le soluzioni.

Ciao!

Alex

Loading