[Oracle PL/SQL] - Problema con Trigger su Campi Data di 2 Tabelle in A...

sabato 23 aprile 2011 - 02.10
Tag Elenco Tags  Oracle 10g

lello82nap Profilo | Newbie


- Ho queste 2 Tabelle in Oracle SQL di sotto riportate e in Associazione 1 a N

-- TABELLE

CREATE TABLE CICLOMOTORE(
TARGA CHAR(6) PRIMARY KEY,
NGARAGE INTEGER NOT NULL,
DISPONIBILITA DATE NOT NULL,
CHECK(NGARAGE>0 AND NGARAGE<4),
CONSTRAINT FK_GARAGE FOREIGN KEY(NGARAGE) REFERENCES GARAGE(NGARAGE));

CREATE TABLE ASSISTENZA (
ID_ASS INTEGER PRIMARY KEY,
N_TESSANITARIA VARCHAR(20) NOT NULL,
N_TESMEDICASA INTEGER,
TARGA CHAR(6),
TIPO_ASS VARCHAR(3) NOT NULL,
CURA VARCHAR(30) NOT NULL,
INIZIO_ASS DATE NOT NULL,
FINE_ASS DATE NOT NULL,
CHECK (TIPO_ASS='ADI'OR TIPO_ASS='ADO'),
CONSTRAINT FK_PAZIENTE FOREIGN KEY (N_TESSANITARIA) REFERENCES PAZIENTE(N_TESSANITARIA),
CONSTRAINT FK_CICLOMOTORE FOREIGN KEY (TARGA) REFERENCES CICLOMOTORE(TARGA),
CONSTRAINT FK_PERSONALE FOREIGN KEY (N_TESMEDICASA) REFERENCES PERSONALE(N_TESMEDICASA));

...poi

- Ho poi un Trigger in Oracle PL/SQL che prima di ogni update su Targa di Assistenza o di inserimento di intera Tupla di Assistenza con Targa!=null controlli se il valore del campo DISPONIBILITA di Ciclomotore sia un valore di Data e Ora inferiori a quello del Campo INIZIO_ASS di Assistenza, in caso contrario se la Data di Disponbibilità è postcedente alla Data di Inizio_Ass
il trigger deve impedire l'inserimento della Targa su Assistenza, settandolo a Null ed infine mandare un messaggio di segnalazione "Scegliere Altro Mezzo' oppure Generare e gestire un EXCEPTION Error.



-- TRIGGER

-- TRIGGER 3 CiclomotoreOccupato

CREATE OR REPLACE TRIGGER AuditingInserimentoAssistenz
BEFORE INSERT ON ASSISTENZA
FOR EACH ROW

DECLARE
dispCiclom DATE;
eccezioneCiclom EXCEPTION;

BEGIN

SELECT DISPONIBILITA INTO dispCiclom FROM CICLOMOTORE;
IF dispCiclom>:NEW.INIZIO_ASS THEN
RAISE eccezioneCiclom;
END IF;

EXCEPTION
WHEN eccezioneCiclom THEN
RAISE_APPLICATION_ERROR(-20022,'---- ERRORE!! CICLOMOTORE AL MOMENTO E'' IMPEGNATO, SCEGLIERE ALTRO CICLOMOTORE ----');
END;
/


PROBLEMA: IL TRIGGER VIENE COMPILATO SENZA ERRORI, PERO' NON FUNZIONA!
IL CONTROLLO SULLE DTE NON AVVIENE MAI, E L'INSERIMENTO QUINDI C'E' SEMPRE.
L'INSERIMENTO NON VIENE VIETATO PER DISPONIBILITA'.CICLOMOTORE > INIZIO_ASS.ASSISTENZA E NON GENERA NEANCHE L'ERRORE.
SBAGLIO NEL CONFRONTO DELLE DATE? O IN COSA?

micto27 Profilo | Senior Member

>-- TRIGGER
>
>-- TRIGGER 3 CiclomotoreOccupato
>
>CREATE OR REPLACE TRIGGER AuditingInserimentoAssistenz
>BEFORE INSERT ON ASSISTENZA
>FOR EACH ROW
>
>DECLARE
>dispCiclom DATE;
>eccezioneCiclom EXCEPTION;
>
>BEGIN
>
>SELECT DISPONIBILITA INTO dispCiclom FROM CICLOMOTORE;
>IF dispCiclom>:NEW.INIZIO_ASS THEN
>RAISE eccezioneCiclom;
>END IF;
>
>EXCEPTION
>WHEN eccezioneCiclom THEN
>RAISE_APPLICATION_ERROR(-20022,'---- ERRORE!! CICLOMOTORE AL
>MOMENTO E'' IMPEGNATO, SCEGLIERE ALTRO CICLOMOTORE ----');
>END;
>/
>
>
>PROBLEMA: IL TRIGGER VIENE COMPILATO SENZA ERRORI, PERO' NON
>FUNZIONA!
>IL CONTROLLO SULLE DTE NON AVVIENE MAI, E L'INSERIMENTO QUINDI
>C'E' SEMPRE.
>L'INSERIMENTO NON VIENE VIETATO PER DISPONIBILITA'.CICLOMOTORE
>> INIZIO_ASS.ASSISTENZA E NON GENERA NEANCHE L'ERRORE.
>SBAGLIO NEL CONFRONTO DELLE DATE? O IN COSA?
>
Ciao,

vedo che nel trigger esegui
SELECT DISPONIBILITA INTO dispCiclom FROM CICLOMOTORE;

ma non manca la clausola WHERE in questa query?

Questa query deve dare eccezione, a meno che la tabella CICLOMOTORE contenga
una sola riga.
Strano però che la INSERT termini senza errori in questo caso.
Smarcato questo dubbio...
sei certo dei valori che l'istruzione IF che verifica le date siano quelli che ti aspetti?

Per verificare potresti, prima della IF eseguire un RAISE_APPLICATION_ERROR infilando nel testo
dell'eccezione i valori che il trigger va a considerare con la IF...

Magari ti arriva per qualche motivo un valore NULL e quindi il test della IF darebbe sempre FALSE.

Non so se queste considerazioni possano darti qualche spunto...
eventualmente... ci "risentiamo".

Michele

lello82nap Profilo | Newbie

Ciao Michele e grazie!
il problema credo di essere io che sono ancora poco pratico e anzitutto non ho spiegato bene questo trigger cosa debba fare. chiedo scusa perchè mi sto avvicinando da poco a oracle.
allora
in pratica io ho bisogno di qualcosa che effettui un confronto fra il campo date DISPONIBILITA' della tupla di CICLOMOTORE e il date INIZIO_ASS della tupla di ASSISTENZA qualora avvenisse un Update del campo TARGA di una Tupla gia' esistente di ASSISTENZA o nel caso di un vero e proprio Inserimeto di nuova tupla su ASSISTENZA, in entrambi i casi cmq si deve controllare che la targa inserita o aggiornata su ASSISTENZA sia NOT NULL, se non è NULL di quella Targa bisogna confrontare l'orario di Disponibilità con l'orario di Inizio Assistenza.
Se l'inizio assistenza è posteriore alla data di disponibilità si deve permettere l'inserimento o l'aggiornamenteo, altrimenti generare errore o mandare un put_line (che non so perkè sul mio oracle non stampa o stampa vuoto) dicendo di "scegliere altro mezzo perchè occupato"

potresti aiutarmi tu? credo sia una cosa abbastanza semplice x voi esperti.
qua ho aperto su 4 forum e nessuno mi da una mano apparte te.

Grazie e Auguri di Buone Feste!!

micto27 Profilo | Senior Member

vediamo se ci si è capiti e se così facciamo progressi:

>in pratica io ho bisogno di qualcosa che effettui un confronto
>fra il campo date DISPONIBILITA' della tupla di CICLOMOTORE e
>il date INIZIO_ASS della tupla di ASSISTENZA qualora avvenisse
>un Update del campo TARGA di una Tupla gia' esistente di ASSISTENZA
>o nel caso di un vero e proprio Inserimeto di nuova tupla su
>ASSISTENZA, in entrambi i casi cmq si deve controllare che la
>targa inserita o aggiornata su ASSISTENZA sia NOT NULL, se non
>è NULL di quella Targa bisogna confrontare l'orario di Disponibilità
>con l'orario di Inizio Assistenza.

Quindi: si vuole associare ad una riga di Assistenza, mediante il campo TARGA un ciclomotore
garantendosi che questo sia disponibile.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Michele

lello82nap Profilo | Newbie

Michele sei un drago!
l'avevo pensata sta soluzione ma credevo che servisse una join con degli aliases x non confondere targa di ciclomotore con quella di assistenza! invece va bene!! GRAZIEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE!!! Mi hai salvato da una figuraccia a ricevimento dal prof!
senti ma hai un contatto internet su cui ti posso reperire piu facilmente? tu sei bravo? mi darestio una mano con un paio di trigger e proceduere in questo modo quando ne avrò bisogno? ho l'esame a maggio e sto un po' terrorizzato dato che il mio prof non ha fatto un corso molto esauriente di sql

fammi sapere, intanto grazie 1000 sul serio! ci sbattevo su da giorni! non sai cosa significa sta liberazione, GRAZIE!!

p.s. c'è un modo in cui possiamo comunicare privatamente qua sopra o msn non so

lello82nap Profilo | Newbie

michele sto provando a contattarti privatamente ma il sito mi fa risultare errore. come devo fare?

micto27 Profilo | Senior Member

in effetti la pagina di "contatto privato" offerta dal Forum sembra non funzionare!

ti passo il link di un documento
https://docs.google.com/document/d/1e_8Ek9ntu99zazWqjkHs3SpDCsTFl6t9pKXQpdnUhVQ/edit?hl=en&authkey=CM7bzo8P

ciao, Michele
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5