Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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)?_Oracle_Plsql_Oracle11g_Database Trigger - Fatal编程技术网

表突变发生在哪里(Oracle)?

表突变发生在哪里(Oracle)?,oracle,plsql,oracle11g,database-trigger,Oracle,Plsql,Oracle11g,Database Trigger,我现在正在处理oracle SQL,并尝试创建一个触发器。出于某种原因,它向我显示了变异表错误,但是,我根本看不到它在哪里变异(它只是一个没有偶数计数的选择,但是它有连接)。我至少应该从哪里开始为解决方案编写复合触发器?似乎只有几个例子,它们离我的太远了,无法理解它在这种特殊情况下应该如何工作 CREATE OR REPLACE TRIGGER "EVGENIJ_BOBROVICH"."FIX_UPD_LIMITS" BEFORE UPDATE OR DELETE ON "EVGENIJ_

我现在正在处理oracle SQL,并尝试创建一个触发器。出于某种原因,它向我显示了变异表错误,但是,我根本看不到它在哪里变异(它只是一个没有偶数计数的选择,但是它有连接)。我至少应该从哪里开始为解决方案编写复合触发器?似乎只有几个例子,它们离我的太远了,无法理解它在这种特殊情况下应该如何工作

  CREATE OR REPLACE TRIGGER "EVGENIJ_BOBROVICH"."FIX_UPD_LIMITS" 
BEFORE UPDATE OR DELETE ON "EVGENIJ_BOBROVICH"."MAP_CALCULATION_SHOP_LIMITS"
FOR EACH ROW
DECLARE
is_deleted_dependant VARCHAR2(1 BYTE);
is_editable_dependant VARCHAR2(1 BYTE);
BEGIN
SELECT IS_DELETE, IS_EDITABLE INTO is_deleted_dependant, is_editable_dependant
FROM MAP_CALCULATION MC INNER JOIN map_calculation_group MG
ON MC.ID_CALC = MG.ID_CALC INNER JOIN map_calculation_shop_limits MS ON MG.ID_GROUP = ms.id_group
WHERE :OLD.ID_GROUP = MG.ID_GROUP AND MG.ID_CALC = MC.ID_CALC;
IF UPDATING AND (is_editable_dependant = 'F' OR is_deleted_dependant = 'T') THEN
RAISE_APPLICATION_ERROR( -20004, '....Error......' );   
ELSIF DELETING AND (is_editable_dependant = 'F' OR is_deleted_dependant = 'T') THEN
RAISE_APPLICATION_ERROR( -20005, '...AnotherError...' );   
END IF;
END;
/
没有触发器的select本身(当然也没有into和old,我使用的是bind变量而不是old)工作得很好…

它发生在这里:

INNER JOIN map_calculation_shop_limits
无法从正在更新的同一个表中进行选择。。。嗯,变异

出于更新目的,您需要

 FROM map_calculation mc
      INNER JOIN map_calculation_group mg ON mc.id_calc = mg.id_calc
      -- INNER JOIN map_calculation_shop_limits MS ON MG.ID_GROUP = ms.id_group       --> this
WHERE     :old.id_group = mg.id_group
      AND mg.id_calc = mc.id_calc
      AND mg.id_group = :new.id_group;          --> and this
对于删除,您将使用
:old.id_group
,这意味着您需要将使用的代码重写为两部分:一部分用于处理更新,另一部分用于处理删除