Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Plsql 行级触发器中的变异表错误_Plsql_Plsqldeveloper - Fatal编程技术网

Plsql 行级触发器中的变异表错误

Plsql 行级触发器中的变异表错误,plsql,plsqldeveloper,Plsql,Plsqldeveloper,将数据库触发器写入 在下午6点到上午10点之间暂停交易 如果记录超过10条,则给出相应的消息 从Mon-Sat中删除超过2个月的数据,并且日期不应为该月的1号。 (即周日休假和月1日休假数据超过2个月) 我试过这个密码 CREATE OR REPLACE TRIGGER EMP_INFO_BFT BEFORE INSERT OR DELETE OR UPDATE ON EMP_INFO FOR EACH ROW DECLARE l_TIME NUMBER(10); l_RECO

将数据库触发器写入

  • 在下午6点到上午10点之间暂停交易
  • 如果记录超过10条,则给出相应的消息
  • 从Mon-Sat中删除超过2个月的数据,并且日期不应为该月的1号。 (即周日休假和月1日休假数据超过2个月)
  • 我试过这个密码

    CREATE OR REPLACE TRIGGER EMP_INFO_BFT BEFORE
      INSERT OR DELETE OR UPDATE ON EMP_INFO
      FOR EACH ROW 
      DECLARE l_TIME NUMBER(10);
      l_RECORD NUMBER;
      BEGIN
       l_TIME:=TO_CHAR(SYSDATE,'HH24');
        IF l_TIME NOT BETWEEN 18 AND 10 THEN
        RAISE_APPLICATION_ERROR(-20003,'TIME ALREADY OVER.....TRANSACTION NOT ALLOWED NOW');
       END IF;
        DELETE
        FROM EMP_INFO
        WHERE TRUNC (HIRE_DATE )                < ADD_MONTHS (TRUNC (SYSDATE), -2)
        AND TO_CHAR (TRUNC (HIRE_DATE ), 'DY') != 'SUN'
        AND TO_CHAR (TRUNC (HIRE_DATE ), 'DD') != '01';
        SELECT COUNT(*) INTO l_RECORD FROM EMP_INFO;
        IF l_RECORD>=10 THEN
          RAISE_APPLICATION_ERROR(-20005,'10 RECORD ALLOWED IN EMP_INFO TABLE');
        END IF;
      END;
    
    在之前创建或替换触发器EMP\u INFO\u BFT
    插入、删除或更新EMP_信息
    每行
    申报l_时间编号(10);
    l_记录编号;
    开始
    l_TIME:=TO_CHAR(SYSDATE,'HH24');
    如果l_时间不在18和10之间,则
    RAISE_应用程序_错误(-20003,“时间已过…..现在不允许交易”);
    如果结束;
    删去
    来自EMP_信息
    其中TRUNC(租用日期)<添加月份(TRUNC(系统日期),-2)
    和TO_CHAR(TRUNC(雇用日期),'DY')!='太阳的
    和TO_CHAR(TRUNC(雇用日期),'DD')!='01';
    从EMP_信息中选择计数(*)进入l_记录;
    如果l_记录>=10,则
    RAISE_应用程序_错误(-20005,“EMP_信息表中允许10条记录”);
    如果结束;
    终止
    

    插入时出现变异错误。

    变异错误

    基本上是说:

    如果一个触发器确实导致一个变异表错误,唯一的实际选择是将触发器重写为语句级触发器

    突变表错误只影响行级触发器。“

    您的代码不引用
    :NEW
    :OLD
    ,因此将其更改为语句级触发器应该很容易,只需删除每行的

    PS

    我认为你们之间的关系行不通

    改变

    IF l_TIME NOT BETWEEN 18 AND 10 THEN
    


    将修复它。

    将此触发器设为自动触发器,请检查以下代码:

    CREATE OR REPLACE TRIGGER EMP_INFO_BFT BEFORE
      INSERT OR DELETE OR UPDATE ON EMP_INFO
      FOR EACH ROW 
      DECLARE l_TIME NUMBER(10);
      l_RECORD NUMBER;
    pragma autonomous_transaction;
      BEGIN
       l_TIME:=TO_CHAR(SYSDATE,'HH24');
        IF l_TIME NOT BETWEEN 18 AND 10 THEN
        RAISE_APPLICATION_ERROR(-20003,'TIME ALREADY OVER.....TRANSACTION NOT ALLOWED NOW');
       END IF;
        DELETE
        FROM EMP_INFO
        WHERE TRUNC (HIRE_DATE )                < ADD_MONTHS (TRUNC (SYSDATE), -2)
        AND TO_CHAR (TRUNC (HIRE_DATE ), 'DY') != 'SUN'
        AND TO_CHAR (TRUNC (HIRE_DATE ), 'DD') != '01';
        commit;
        SELECT COUNT(*) INTO l_RECORD FROM EMP_INFO;
        IF l_RECORD>=10 THEN
          RAISE_APPLICATION_ERROR(-20005,'10 RECORD ALLOWED IN EMP_INFO TABLE');
        END IF;
      END;
    
    在之前创建或替换触发器EMP\u INFO\u BFT
    插入、删除或更新EMP_信息
    每行
    申报l_时间编号(10);
    l_记录编号;
    布拉格自治交易;
    开始
    l_TIME:=TO_CHAR(SYSDATE,'HH24');
    如果l_时间不在18和10之间,则
    RAISE_应用程序_错误(-20003,“时间已过…..现在不允许交易”);
    如果结束;
    删去
    来自EMP_信息
    其中TRUNC(租用日期)<添加月份(TRUNC(系统日期),-2)
    和TO_CHAR(TRUNC(雇用日期),'DY')!='太阳的
    和TO_CHAR(TRUNC(雇用日期),'DD')!='01';
    犯罪
    从EMP_信息中选择计数(*)进入l_记录;
    如果l_记录>=10,则
    RAISE_应用程序_错误(-20005,“EMP_信息表中允许10条记录”);
    如果结束;
    终止
    
    CREATE OR REPLACE TRIGGER EMP_INFO_BFT BEFORE
      INSERT OR DELETE OR UPDATE ON EMP_INFO
      FOR EACH ROW 
      DECLARE l_TIME NUMBER(10);
      l_RECORD NUMBER;
    pragma autonomous_transaction;
      BEGIN
       l_TIME:=TO_CHAR(SYSDATE,'HH24');
        IF l_TIME NOT BETWEEN 18 AND 10 THEN
        RAISE_APPLICATION_ERROR(-20003,'TIME ALREADY OVER.....TRANSACTION NOT ALLOWED NOW');
       END IF;
        DELETE
        FROM EMP_INFO
        WHERE TRUNC (HIRE_DATE )                < ADD_MONTHS (TRUNC (SYSDATE), -2)
        AND TO_CHAR (TRUNC (HIRE_DATE ), 'DY') != 'SUN'
        AND TO_CHAR (TRUNC (HIRE_DATE ), 'DD') != '01';
        commit;
        SELECT COUNT(*) INTO l_RECORD FROM EMP_INFO;
        IF l_RECORD>=10 THEN
          RAISE_APPLICATION_ERROR(-20005,'10 RECORD ALLOWED IN EMP_INFO TABLE');
        END IF;
      END;