PL错误中的PL / SQL触发器

时间:2015-06-02 00:19:27

标签: oracle plsql triggers

我不知道怎么开始!! 我在oracle数据库中有一个工作,它是关于触发器和约束的... 工作是在hokey联盟数据库的某些表上创建触发器和约束... 因为我是新手,而且不熟悉触发器我有很多错误!!!

让我们以这两个表为例:

1 /“equipe”(指团队)表:

- (NSInteger)winningNumber {
    do{
        _winningNumber = arc4random() %10 +1;
    }
    while (_winningNumber ==5);
    return _winningNumber;
}

2 /“joueur”(指玩家):

UIButton

其中:

“id_eq”和“id_jou”是主键。

“joueur.id_eq”被引用为“equipe.id_eq”。

“equipe.id_capitaine”引用“joueur.id_jou”。

我想创建一个触发器,如果​​用户插入或更新“equipe”表,其中“capitaine”不是团队中的玩家(“equipe”),则写​​入msg的错误,我尝试了很多, buttt ...总是信息:

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)

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

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

如果您对触发器有一些很好的参考,那么对于那些大型的人来说,请使用pl / sql Oracle吧!

谢谢;)

1 个答案:

答案 0 :(得分:0)

当然,还有其他方法可以实现您的逻辑,但如果您想使用触发器,以下内容适用于我

创建设备:

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。我不确定这是否反映了您的真实代码或仅仅是一个错字。