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
。我不确定这是否反映了您的真实代码或只是此处的错字。
我不知道如何开始!! 我在 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
。我不确定这是否反映了您的真实代码或只是此处的错字。