[SQL - Oracle] propleme de trigger

  • Auteur de la discussion KangOl
  • Date de début

KangOl

Grand Maître
voila j'ai des probleme avec un trigger.
j'ai un fichier .sql mai quand je l'execute sous sqlplus, il cale au moment de creer les tiggers et je ne sais pas pourquoi.

[fixed]-- Création des Triggers
---------------------------
CREATE OR REPLACE TRIGGER VerifDateNaiss
BEFORE INSERT OR UPDATE OF DATENAISS_PATIENT ON PATIENTS
FOR EACH ROW
BEGIN
IF (NEW.DATENAISS_PATIENT >= SYSDATE)
-- THEN
RAISE_APPLICATION_ERROR(-20001,'Date de Naissance doit être inferieur à la date du jour');
END IF;
END;
[/fixed]
 

cisco

Habitué
ben si c'est ca:

CREATE OR [g]REPLaACE [/g]TRIGGER VerifDateNaiss

1s
 

cisco

Habitué
ha ca peut être aussi
IF ([g]NEW[/g].DATENAISS_PATIENT >= SYSDATE)

a remplacer par
IF :)new.DATENAISS_PATIENT >= SYSDATE)

 

KangOl

Grand Maître
non le a dans REPLACE ct pour tester si ! :ange:

le new en minuscule ?? je vois pas pourquoi, c'est case inssentitive :/
 

cisco

Habitué
ben c'est la syntaxe
[g]:new [/g]c'est la reference vers la nouvelle valeur
[g]:old [/g]ce qui avait avant
 

KangOl

Grand Maître
[citation=1810,1][nom]kangol a écrit[/nom]bha la

ya les deux :/

je testerai demain :o
[/citation]

de cette url :
[fixed]CREATE TRIGGER scott.salary_check
BEFORE
INSERT OR UPDATE OF sal, job ON scott.emp
FOR EACH ROW
WHEN (new.job <> 'PRESIDENT')
pl/sql_block[/fixed]

je fait la meme chose et ca fonctionne pas :cry:
 

KangOl

Grand Maître
voila mon script SQL
[fixed]SET ECHO OFF
SET FEEDBACK OFF
SPOOL InpresPharma.log

-- Dropage des Tables
------------------------
PROMPT Suppression des tables
DROP TABLE LIGNES_COMMANDES;
DROP TABLE MEDICAMENTS;
DROP TABLE FIRMES;
DROP TABLE COMMANDES;
DROP TABLE PATIENTS;
DROP TABLE MUTUELLES;
PROMPT DONE

-- Dropage des Séquences
--------------------------
PROMPT Suppression des sequences
DROP SEQUENCE SEQ_MUTUELLE;
DROP SEQUENCE SEQ_COMMANDE;
DROP SEQUENCE SEQ_FIRME;
DROP SEQUENCE SEQ_MEDICAMENT;
PROMPT DONE

-- Créations des Tables
-------------------------
PROMPT Creation des tables
PROMPT \-> MUTUELLES
CREATE TABLE MUTUELLES
(
REF_MUTUELLE NUMBER(10) NOT NULL,
CONSTRAINT CPMUTUELLE PRIMARY KEY (REF_MUTUELLE),
NOM_MUTUELLE VARCHAR2(50) NOT NULL
);
PROMPT ...DONE

PROMPT \-> PATIENTS
CREATE TABLE PATIENTS
(
NUM_MUTUELLE NUMBER(10) NOT NULL,
CONSTRAINT CPPATIENT PRIMARY KEY (NUM_MUTUELLE),
NOM_PATIENT VARCHAR2(30) NOT NULL,
PRENOM_PATIENT VARCHAR2(30) NOT NULL,
SEXE_PATIENT VARCHAR2(1), CONSTRAINT CHEK_SEXE CHECK (SEXE_PATIENT IN ('M','F')),
DATENAISS_PATIENT DATE,
GSM_PATIENT VARCHAR(10),
REF_MUTUELLE NUMBER(10),
CONSTRAINT CEMUTUELLE FOREIGN KEY (REF_MUTUELLE) REFERENCES MUTUELLES (REF_MUTUELLE)
);
PROMPT ...DONE

PROMPT \-> COMMANDES
CREATE TABLE COMMANDES
(
REF_COMMANDE NUMBER(10) NOT NULL,
CONSTRAINT CPCOMMANDE PRIMARY KEY (REF_COMMANDE),
DATE_COMMANDE DATE NOT NULL,
NUM_MUTUELLE NUMBER(10),
CONSTRAINT CECOMMANDE FOREIGN KEY (NUM_MUTUELLE) REFERENCES PATIENTS (NUM_MUTUELLE)
);
PROMPT ...DONE

PROMPT \-> FIRMES
CREATE TABLE FIRMES
(
REF_FIRME NUMBER(10) NOT NULL,
CONSTRAINT CPFIRME PRIMARY KEY (REF_FIRME),
NOM_FIRME VARCHAR2(50) NOT NULL
);
PROMPT ...DONE

PROMPT \-> MEDICAMENTS
CREATE TABLE MEDICAMENTS
(
REF_MEDICAMENT NUMBER(10) NOT NULL, CONSTRAINT CPMEDICAMENT PRIMARY KEY (REF_MEDICAMENT),
DENOMINATION_MEDICAMENT VARCHAR2(50) NOT NULL,
REF_FIRME NUMBER(10),
CONSTRAINT CEFIRME FOREIGN KEY (REF_FIRME) REFERENCES FIRMES (REF_FIRME)
);
PROMPT ...DONE

PROMPT \-> LIGNES_COMMANDES
CREATE TABLE LIGNES_COMMANDES
(
REF_COMMANDE NUMBER(10) NOT NULL,
REF_MEDICAMENT NUMBER(10) NOT NULL,
CONSTRAINT CP_LC PRIMARY KEY (REF_COMMANDE,REF_MEDICAMENT),
CONSTRAINT CE_LC_COM FOREIGN KEY (REF_COMMANDE) REFERENCES COMMANDES(REF_COMMANDE),
CONSTRAINT CE_LC_MED FOREIGN KEY (REF_MEDICAMENT) REFERENCES MEDICAMENTS(REF_MEDICAMENT),
DATE_LIVRAISON DATE NOT NULL,
DATE_PAYEMENT DATE NOT NULL,
QUANTITE_COMMANDE VARCHAR2(10) NOT NULL
);
PROMPT ...DONE
PROMPT DONE

-- Création des Séquences
----------------------------
PROMPT Creation des sequences
CREATE SEQUENCE SEQ_MUTUELLE START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE SEQ_COMMANDE START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE SEQ_FIRME START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE SEQ_MEDICAMENT START WITH 1 INCREMENT BY 1;
PROMPT DONE

PROMPT Insertion de quelques valeurs dans la table 'MUTUELLES'
INSERT INTO MUTUELLES VALUES (1,'F.M.S.S.');
INSERT INTO MUTUELLES VALUES (2,'MUTUELLE CHRETIENNE');
INSERT INTO MUTUELLES VALUES (3,'MUTUELLE LIBRE');
PROMPT DONE



-- Création des Triggers
---------------------------
-- ca fonctionne pas ?!?
PROMPT Creation des Triggers
CREATE OR REPLACE TRIGGER VerifDateNaiss
BEFORE INSERT OR UPDATE OF DATENAISS_PATIENT ON PATIENTS
FOR EACH ROW
WHEN (new.DATENAISS_PATIENT >= SYSDATE) -- :new ??
RAISE_APPLICATION_ERROR(-20001,'Date de Naissance doit être inferieur à la date du jour');

PROMPT DONE;


SET FEEDBACK ON;
COMMIT;
SPOOL OFF;
[/fixed]

et le resultat
[fixed]Suppression des tables
DONE
Suppression des sequences
DONE
Creation des tables
\-> MUTUELLES
...DONE
\-> PATIENTS
...DONE
\-> COMMANDES
...DONE
\-> FIRMES
...DONE
\-> MEDICAMENTS
...DONE
\-> LIGNES_COMMANDES
...DONE
DONE
Creation des sequences
DONE
Insertion de quelques valeurs dans la table 'MUTUELLES'
DONE
Creation des Triggers
13[/fixed]

la obliger de faiure un control c :/
 

cisco

Habitué
manque les begin et end

[fixed]
CREATE OR REPLACE TRIGGER VerifDateNaiss
BEFORE INSERT OR UPDATE OF mydate ON product
FOR EACH ROW
BEGIN
WHEN :)new.mydate >= SYSDATE)
RAISE_APPLICATION_ERROR(-20001,'Date de Naissance doit être inferieur à la date du jour');
BEGIN;
[/fixed]

Ca, ca passe (et avec le ":")
 

cisco

Habitué
[fixed]
CREATE OR REPLACE TRIGGER VerifDateNaiss
BEFORE INSERT OR UPDATE OF DATENAISS_PATIENT ON PATIENTS
FOR EACH ROW
begin
WHEN (new.DATENAISS_PATIENT >= SYSDATE) -- :new ??
RAISE_APPLICATION_ERROR(-20001,'Date de Naissance doit être inferieur à la date du jour');
end;
[/fixed]

je viens de les creer sur ma db (oracle 8.16) et ca passe (rem dans post précédent remplace le dernier begin par un end)


le commit ne sert que pour les insert (dml) et pas pour les commande DDL

Une remarque: les clef primaire ne doivent jamais être des clefs businnes

[fixed]
CREATE TABLE PATIENTS
(
NUM_MUTUELLE NUMBER(10) NOT NULL,
CONSTRAINT CPPATIENT PRIMARY KEY (NUM_MUTUELLE),
NOM_PATIENT VARCHAR2(30) NOT NULL,
PRENOM_PATIENT VARCHAR2(30) NOT NULL,
SEXE_PATIENT VARCHAR2(1), CONSTRAINT CHEK_SEXE CHECK (SEXE_PATIENT IN ('M','F')),
DATENAISS_PATIENT DATE,
GSM_PATIENT VARCHAR(10),
REF_MUTUELLE NUMBER(10),
CONSTRAINT CEMUTUELLE FOREIGN KEY (REF_MUTUELLE) REFERENCES MUTUELLES (REF_MUTUELLE)
);
[/fixed]
c'est pas bo!
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 335
Messages
6 722 833
Membres
1 586 837
Dernier membre
Flvshmusic
Partager cette page
Haut