PL / SQL:我的程序运行正常但不是我的例外吗?

时间:2017-08-13 20:53:10

标签: plsql plsqldeveloper

如果我的英语不完美,我道歉。这不是我的母语。

我正在处理的包有些问题。我正在使用sqldeveloper,我在PL / SQL中编写。

程序“Ajouter”应该添加一个游泳者,你必须指定姓名,姓氏......当我尝试并给出正确的信息时,它运作良好。 但是当我尝试测试我的异常时,它不起作用。我的例外都不起作用。例如,如果我尝试在性别中写“Z”,它就不会告诉我“性别必须是F或M”。它只告诉我“ProcédurePL/ SQLterminée。”,类似于“PL / SQL程序已完成。”。

问题出在哪里?如何解决此问题并使我的例外工作?

如果我的信息不够清楚,请随时告诉我。感谢您抽出宝贵时间考虑我的问题。 祝你今天愉快 ! :)

这是“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 ;

2 个答案:

答案 0 :(得分:0)

我建议在IF语句之前在每个异常处理程序中添加dbms_output.put_line语句,以准确查看package-lock.json的文本。

您的异常处理程序打印消息但不传播异常。也许你想在每个异常处理程序的末尾添加一个SQLERRM,将异常传播回调用者,如下所示。

RAISE;

答案 1 :(得分:0)

当您在Oracle中命名对象时,没有分隔符:

CONSTRAINT EveNomNotNull NOT NULL

实际约束名称不区分大小写,因此错误消息中的约束名称将报告为:

EVENOMNOTNULL

您可以通过运行以下查询来检查:

select constraint_name from all_constraints where table_name = 'NAGEURS';

这就是使用INSTR的以下条件无法检测约束名称的原因:

IF(INSTR(SQLERRM, 'EveNomNotNull') <> 0) THEN

由于INSTR执行区分大小写的搜索,因此必须确保它与数据库中创建的约束名称匹配,例如:

IF(INSTR(SQLERRM, 'EVENOMNOTNULL') <> 0) THEN