【发布时间】:2017-08-13 20:53:09
【问题描述】:
我正在处理的软件包有一些问题。我正在使用 sqldeveloper,我用 PL/SQL 编写。
程序"Ajouter"应该添加一个游泳者,你必须指定名字,姓氏等。当我尝试它并提供正确的信息时,它运行良好。
但是当我尝试测试我的异常时,它不起作用。我的任何例外都不起作用。例如,如果我尝试在 sexe 中写 "Z",它不会告诉我 "Sex has to be F or M"。它只告诉我"Procédure PL/SQL terminée.",类似于"PL / SQL procedure completed."。
问题出在哪里?我怎样才能解决这个问题并使我的异常工作?
这是“Ajouter”(添加)代码:
PROCEDURE Ajouter(Nageur Nageurs%ROWTYPE) AS
ExcNull EXCEPTION;
PRAGMA EXCEPTION_INIT(ExcNull, -1400);
ExcPK EXCEPTION;
PRAGMA EXCEPTION_INIT(ExcPK, -00001);
ExcFK EXCEPTION;
PRAGMA EXCEPTION_INIT(ExcFK, -2291);
ExcCheck EXCEPTION;
PRAGMA EXCEPTION_INIT(ExcCheck, -2290);
BEGIN
INSERT INTO Nageurs values (Nageur.NRLIGUE, Nageur.NOM, Nageur.PRENOM,
Nageur.ANNEENAISS, Nageur.SEXE, Nageur.CATEGORIE, Nageur.CLUB, Nageur.ADRESSE,
Nageur.CODEPOSTAL, Nageur.LOCALITE, Nageur.NRTELEPHONE, Nageur.EMAIL, Nageur.GSM, Nageur.COTISATION);
COMMIT;
DBMS_OUTPUT.PUT_LINE('Nageur ajouté');
EXCEPTION
WHEN ExcNull THEN
IF(INSTR(SQLERRM, 'EveNomNotNull') <> 0) THEN DBMS_OUTPUT.PUT_LINE('Le nom ne peut pas être null.');
ELSIF (INSTR(SQLERRM, 'EvePrenomNotNull') <> 0) THEN DBMS_OUTPUT.PUT_LINE('Le prenom ne peut pas être null.');
ELSIF (INSTR(SQLERRM, 'EveNaissanceNotNull') <> 0) THEN DBMS_OUTPUT.PUT_LINE('L''annee ne peut pas être null.');
ELSIF (INSTR(SQLERRM, 'EveSexeNotNull') <> 0) THEN DBMS_OUTPUT.PUT_LINE('Le sexe ne peut pas être null.');
END IF;
WHEN ExcPK THEN
IF(INSTR(SQLERRM, 'EveCpNageurs') <> 0) THEN DBMS_OUTPUT.PUT_LINE('Le nageur existe deja.');
ELSIF (INSTR(SQLERRM, 'EveUnicite') <> 0) THEN DBMS_OUTPUT.PUT_LINE('Le prénom et le nom doivent etre uniques.');
END IF;
WHEN ExcFK THEN
IF(INSTR(SQLERRM, 'EveRefNageursCat') <> 0) THEN DBMS_OUTPUT.PUT_LINE('La categorie n''existe pas');
ELSIF (INSTR(SQLERRM, 'EveRefNageursClubs') <> 0) THEN DBMS_OUTPUT.PUT_LINE('Le club n''existe pas');
ELSIF (INSTR(SQLERRM, 'EveRefNageursCP') <> 0) THEN DBMS_OUTPUT.PUT_LINE('Le code postal n''existe pas.');
END IF;
WHEN ExcCheck THEN
IF(INSTR(SQLERRM, 'EveSexe') <> 0) THEN DBMS_OUTPUT.PUT_LINE('Le sexe doit être F ou M');
ELSIF (INSTR(SQLERRM, 'EveCotisation') <> 0) THEN DBMS_OUTPUT.PUT_LINE('La cotisation doit être O ou N');
END IF;
WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('Exception : Trop de données.');
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Pas de données.');
WHEN OTHERS THEN RAISE;
END;
这是 Nageur(游泳运动员)的桌子:
CREATE TABLE Nageurs
(NrLigue CHAR(14)
CONSTRAINT EveCpNageurs PRIMARY KEY,
Nom VARCHAR2(20)
CONSTRAINT EveNomNotNull NOT NULL,
Prenom VARCHAR2(20)
CONSTRAINT EvePrenomNotNull NOT NULL,
AnneeNaiss NUMBER(4)
CONSTRAINT EveNaissanceNotNull NOT NULL,
Sexe CHAR(1)
CONSTRAINT EveSexeNotNull NOT NULL
CONSTRAINT EveSexe CHECK (Sexe in ('F','M')),
Categorie CHAR(2)
CONSTRAINT EveRefNageursCat REFERENCES Categories(Categorie),Club CHAR(5)
CONSTRAINT EveRefNageursClubs REFERENCES Clubs (Club),
Adresse VARCHAR2(50),
CodePostal CHAR(5)
CONSTRAINT EveRefNageursCP REFERENCES CodePostaux (CodePostal),
Localite VARCHAR2(20),
NrTelephone CHAR(15),
EMAIL VARCHAR2(50),
GSM CHAR(15),
Cotisation CHAR(1)
CONSTRAINT EveCotisation CHECK (Cotisation in ('O','N')),
CONSTRAINT EveUnicite UNIQUE (Nom, Prenom)
);
这是一个不起作用的测试示例:
DECLARE
nag nageurs%rowtype;
BEGIN
nag.nrligue := '01/000325/CCM';
nag.nom := 'DISNEY';
nag.prenom := 'WALTER';
nag.anneenaiss := '1901';
nag.sexe := 'Z';
nag.club := 'CCM';
EveGestionNageursMasters.Ajouter(nag);
END ;
【问题讨论】:
-
很可能,您没有打开输出 - 例如“set serveroutput on”(或者,如果您使用的是像 Toad 或 PL/SQL Developer 这样的 GUI,那么您没有找到正确的位置)。然而,这是一种处理异常的*可怕*方式——不要将消息输出到不会被看到的东西;而是使用 raise 或 raise_application_error 来专门停止过程的执行并将错误消息传递回调用过程。更安全。
-
感谢您的 cmets,我已经设置了“SET serveroutput ON size unlimited;”在我的包裹的开头,对不起,我应该提到它。我要看看 raise_application_error。 :)
标签: plsql plsqldeveloper