[SQL - Oracle] propleme de trigger
Dernière réponse : dans Programmation
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.
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.
-- 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;
---------------------------
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;
Autres pages sur : sql oracle propleme trigger
Lassé par la pub ? Créez un compte
kangol a écritbha la http://wpi.wpi.edu/server.815/a67779/ch4h.htm#26408
ya les deux
je testerai demain
ya les deux
je testerai demain
de cette url :
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
BEFORE
INSERT OR UPDATE OF sal, job ON scott.emp
FOR EACH ROW
WHEN (new.job <> 'PRESIDENT')
pl/sql_block
je fait la meme chose et ca fonctionne pas
voila mon script SQL
et le resultat
la obliger de faiure un control c
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;
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;
et le resultat
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
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
la obliger de faiure un control c
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;
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
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)
);
c'est pas bo!
le end (y avait un begin...)
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;
ca passe?
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;
ca passe?
cisco a écritle end (y avait un begin...)
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;
ca passe?
ca plante avant ! ca plante au CREATE 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;
ca passe?
CREATE TABLE MUTUELLES
(
REF_MUTUELLE NUMBER(10) NOT NULL,
CONSTRAINT CPMUTUELLE PRIMARY KEY (REF_MUTUELLE),
NOM_MUTUELLE VARCHAR2(50) NOT NULL
);
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)
);
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;
Ca chez moi ca passe...
(je viens de le faire et c'est un copié collé)
Si ca passe pas, c'est un pb de config (genre grant sur trigger)
non c pas ca !!
version qui fonctionne :
et oui ! il faut un slash a la fin
version qui fonctionne :
CREATE OR REPLACE TRIGGER VerifDateNaiss
BEFORE INSERT OR UPDATE OF DATENAISS_PATIENT ON PATIENTS
FOR EACH ROW WHEN (new.DATENAISS_PATIENT >= SYSDATE)
begin
RAISE_APPLICATION_ERROR(-20001,'Date de Naissance doit être inferieur à la date du jour');
end;
[color=#FF0000]/[/color]
et oui ! il faut un slash a la fin
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumCreer trigger oracle sql
- ForumNombre de ligne sql oracle
- articlesEncoder un amp en sql sous oracle
- ForumSql oracle vba excel
- articlesMigrer base sql vers oracle
- ForumMigration base sql vers oracle
- ForumSql trigger
- ForumOracle sql plus
- articlesOracle probleme trigger
- articlesTrigger oracle
- Voir plus