PL/SQL 在 Oracle 错误中触发

PL/SQL Trigger in Oracle errors

我不知道如何开始!! 我在 oracle 数据库中工作,它是关于触发器和约束的…… 这项工作是在曲棍球联盟的一些 table 数据库上创建触发器和约束... 因为我是新手,不熟悉触发器,所以我有很多错误!!!

我们以这两个table为例:

1/ "equipe"(表示团队)table :

Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
ID_EQ                                     NOT NULL NUMBER(6)
NOM                                                VARCHAR2(50)
ENREGISTRMENT                                      VARCHAR2(50)
ID_LIG                                             NUMBER(6)
ID_CAPITAINE                                       NUMBER(6)
ID_ENT                                             NUMBER(6)

2/ "joueur"(表示玩家):

Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
ID_JOU                                    NOT NULL NUMBER(6)
NUMERO                                             NUMBER(4)
POSITION                                           VARCHAR2(50)
ID_EQ                                              NUMBER(6)

其中:

"id_eq" 和 "id_jou" 是主键。

"joueur.id_eq" 引用了 "equipe.id_eq".

"equipe.id_capitaine" 引用了 "joueur.id_jou".

我想创建一个触发器,如果​​用户插入或更新 table "equipe" 其中 "capitaine" 不是团队中的玩家( "equipe") ,我尝试了很多,buttt ...总是味精:

Warning: Trigger created with compilation errors.

这是触发器之一,如果有人能找到错误并修复它,或者提出更好的建议:

CREATE OR REPLACE TRIGGER capitaine_in_equipe
before UPDATE OR INSERT ON equipe
FOR EACH ROW 
DECLARE
  id_p joueur.id_eq%TYPE;
BEGIN
if (:new.iq_capitaine is not null ) then
   SELECT id_eq INTO id_p 
   FROM joueur
   WHERE id_jou = :new.iq_capitaine;
   IF ( id_p != :new.id_eq ) THEN
      raise_application_error(-20100,' the captain is not a player of the team');
   END IF;
END IF;
END;

如果您知道一些很好的触发器参考,pl/sql Oracle for biggeners,拜托了!

谢谢 ;)

当然,还有其他方法可以实现你的逻辑,但如果你想使用你的触发器,下面的方法对我有用

创建装备:

CREATE TABLE equipe
( ID_EQ number(6) not null,
NOM varchar2(50),
ENREGIS number(6),
ID_CAPITAINE number(6),
ID_ENT number(6),
CONSTRAINT equipe_pk PRIMARY KEY (ID_EQ)
);

创建 joueur:

create table joueur
(ID_JOU number(6) not null,
NUMERO number(4),
POSITION varchar2(50),
ID_EQ number(6),
CONSTRAINT joueur_pk PRIMARY KEY (id_jou)
);

用外键改变两者:

alter table equipe add(CONSTRAINT fk_equipe
FOREIGN KEY (ID_CAPITAINE)
REFERENCES joueur(ID_JOU));


alter table joueur add(CONSTRAINT fk_joueur
FOREIGN KEY (id_eq)
REFERENCES equipe(ID_EQ));

创建触发器:

CREATE OR REPLACE TRIGGER capitaine_in_equipe
before UPDATE OR INSERT ON equipe
FOR EACH ROW 
DECLARE
  id_p joueur.id_eq%TYPE;
BEGIN
if (:new.id_capitaine is not null ) then
   SELECT id_eq INTO id_p 
   FROM joueur
   WHERE id_jou = :new.id_capitaine;
   IF ( id_p != :new.id_eq ) THEN
      raise_application_error(-20100,' the captain is not a player of the team');
   END IF;
END IF;
END;

请注意,在您的表定义中,您提到了一个列 id_capitaine。在您的触发器中,您使用了名称 iq_capitaine。我不确定这是否反映了您的真实代码或只是此处的错字。