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
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;