我需要将触发器合并到一个使用游标的脚本中。因此,我有一个带有光标的脚本和一个创建触发器的脚本(名为“trigEmpRaise”)。触发器是在没有错误的情况下创建的,但是当我使用光标运行脚本时(在创建触发器之前运行得很好),我得到了以下错误:
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SCOTT.TRIGEMPRAISE", line 8
ORA-04088: error during execution of trigger 'SCOTT.TRIGEMPRAISE'
ORA-06512: at line 34
以下是表的说明:
SQL> describe empcopy
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> describe emp_prob1;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
DEPTNO NUMBER(2)
SAL NUMBER(7,2)
SQL> describe empraises;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(15)
SAL NUMBER(7,2)
DATEOF DATE
下面是脚本:带游标的脚本(触发触发器)
SET SERVEROUTPUT ON
DECLARE
vEMPNO empcopy.empno%TYPE;
VENAME empcopy.ename%TYPE;
vDEPTNO empcopy.deptno%TYPE;
vSAL empcopy.sal%TYPE;
CURSOR deptnoCUR IS
SELECT empno, ename, deptno, sal
FROM empcopy
ORDER BY deptno;
FUNCTION calcSal
(fDEPTNO varchar2, fSAL number)
RETURN NUMBER IS
fNewSal empcopy.sal%TYPE;
BEGIN
IF fDEPTNO = 10 THEN
fNewSal := fSAL + fSAL * .05;
ELSE
IF fDEPTNO = 20 THEN
fNewSal := fSAL + fSAL * .075;
ELSE
fNewSal := fSAL + fSAL * .10;
END IF;
END IF;
RETURN fNewSal;
END calcSal;
BEGIN
OPEN deptnoCUR;
LOOP
FETCH deptnoCUR INTO vEMPNO, vENAME, VDEPTNO, vSAL;
EXIT WHEN deptnoCUR%NOTFOUND;
vSAL := calcSal(vDEPTNO,vSAL);
INSERT INTO emp_prob1
VALUES(vEMPNO,vENAME,vDEPTNO,vSAL);
END LOOP;
CLOSE deptnoCUR;
END;
/
SET SERVEROUTPUT OFF
SELECT * FROM emp_prob1;
和触发器脚本:
CREATE OR REPLACE TRIGGER trigEmpRaise
AFTER INSERT ON emp_prob1
DECLARE
vEMPNO empraises.empno%TYPE;
vENAME empraises.ename%TYPE;
vSAL empraises.sal%TYPE;
vDATE empraises.dateof%TYPE := sysdate;
BEGIN
SELECT empno, ename, sal
INTO vEMPNO, vENAME, vSAL
FROM emp_prob1;
INSERT INTO empraises (empno,ename,sal,dateof)
VALUES(vEMPNO,vENAME,vSAL,vDATE);
END;
/
带有游标的脚本只是遍历表EMPCOPY中的每条记录,并根据它们所在的DEPTNO对它们进行提升。然后将新值插入到表EMP_PROB1中。
触发器应该在将值插入到EMP_PROB1中,并将新的薪水和插入发生的系统日期放到表EMPRAISES中之后发生。
然而,无论我做什么,上述错误都会继续发生。有什么帮助吗?
发布于 2013-12-08 19:51:54
SELECT empno, ename, sal INTO vEMPNO, vENAME, vSAL FROM emp_prob1;
必须恰好返回1行-不多也不少。
我的假设是你喜欢这样做:
CREATE OR REPLACE TRIGGER trigEmpRaise
AFTER INSERT ON emp_prob1
FOR EACH ROW
BEGIN
INSERT INTO empraises (empno,ename,sal,dateof)
VALUES(:new.empno,:new.ename,:new.sal,sysdate);
END;
/
https://stackoverflow.com/questions/20456894
复制