Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQLDeveloper SQL触发器创建问题我无法解决_Oracle_Plsql_Triggers - Fatal编程技术网

Oracle SQLDeveloper SQL触发器创建问题我无法解决

Oracle SQLDeveloper SQL触发器创建问题我无法解决,oracle,plsql,triggers,Oracle,Plsql,Triggers,我想创建一个触发器来管理两本杂志《Elle》和《Time》 因此,如果用户试图在杂志表中插入与这两条不匹配的新记录,则不应保留后者 我已经准备好了所有的桌子和东西,这没有问题 问题是我想不出正确的方法,一位朋友说我的代码只与行交互,我需要整个表的代码,并建议我使用游标 这是我的密码: Create or replace trigger TMag After INSERT on Magazine FOR EACH ROW DECLARE e EXCEPTION; BEGIN IF :new.mag

我想创建一个触发器来管理两本杂志《Elle》和《Time》

因此,如果用户试图在杂志表中插入与这两条不匹配的新记录,则不应保留后者

我已经准备好了所有的桌子和东西,这没有问题

问题是我想不出正确的方法,一位朋友说我的代码只与行交互,我需要整个表的代码,并建议我使用游标

这是我的密码:

Create or replace trigger TMag
After INSERT on Magazine
FOR EACH ROW
DECLARE
e EXCEPTION;
BEGIN
IF :new.mag_nom!= 'Elle' or :new.mag_nom!= 'Time' THEN
Delete from Magazine where ISBN=:new.ISBN;
raise e;
END IF;
exception
when e then dbms_output.put_line('nom mag incorrecte');
END;
下面是我桌子上的一张:

CLIENT(CIN, CL_NOM, CL_ADDR, CL_VILLE, EMAIL, CONTACT_NUM);
MAGAZINE(ISBN, MAG_NOM, PRIX_Mois);
ABONNEMENT(AB_ID, #ISBN, #IN_ID, Months);
INVOICE(IN_ID, #CIN, dateI, State) ;

提前感谢

您不能在触发器所属的同一个表上使用DML-your-delete。将触发器更改为在插入之前触发,然后只引发错误以防止插入首先发生

请注意,您还必须为异常声明一个代码号,并且您的逻辑应该是if new.name!='Elle'和new.name!='时间'。如果使用或,则触发器将不允许在表上进行任何插入

CREATE OR REPLACE TRIGGER TMAG
BEFORE INSERT ON MAGAZINE
FOR EACH ROW
DECLARE
    e_bad_mag_nom EXCEPTION;
    PRAGMA EXCEPTION_INIT (e_bad_mag_nom, -20001)
BEGIN
    IF :new.mag_nom!= 'Elle' AND :new.mag_nom!= 'Time' THEN
        raise e_bad_mag_nom;
    END IF;
EXCEPTION
    when e_bad_mag_nom then dbms_output.put_line('nom mag incorrecte');
END;
参考资料请参见此处:


不能在触发器所属的同一个表上使用DML和delete。将触发器更改为在插入之前触发,然后只引发错误以防止插入首先发生

请注意,您还必须为异常声明一个代码号,并且您的逻辑应该是if new.name!='Elle'和new.name!='时间'。如果使用或,则触发器将不允许在表上进行任何插入

CREATE OR REPLACE TRIGGER TMAG
BEFORE INSERT ON MAGAZINE
FOR EACH ROW
DECLARE
    e_bad_mag_nom EXCEPTION;
    PRAGMA EXCEPTION_INIT (e_bad_mag_nom, -20001)
BEGIN
    IF :new.mag_nom!= 'Elle' AND :new.mag_nom!= 'Time' THEN
        raise e_bad_mag_nom;
    END IF;
EXCEPTION
    when e_bad_mag_nom then dbms_output.put_line('nom mag incorrecte');
END;
参考资料请参见此处:


我认为您不需要触发器,而是通过创建检查约束(如

ALTER TABLE Magazine
ADD CONSTRAINT correcte_mag_nom  
  CHECK (mag_nom IN ('Elle', 'Time'));
如果提供的值不符合mag_nom列的条件,则它将作为

ORA-02290 check constrain (<schema>.CORRECTE_MAG_NUM) violated

我认为您不需要触发器,而是通过创建检查约束(如

ALTER TABLE Magazine
ADD CONSTRAINT correcte_mag_nom  
  CHECK (mag_nom IN ('Elle', 'Time'));
如果提供的值不符合mag_nom列的条件,则它将作为

ORA-02290 check constrain (<schema>.CORRECTE_MAG_NUM) violated