首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >执行触发器时,exact fetch返回的行数超过请求行数SQL*PLUS

执行触发器时,exact fetch返回的行数超过请求行数SQL*PLUS
EN

Stack Overflow用户
提问于 2013-12-09 02:00:45
回答 1查看 850关注 0票数 0

我需要将触发器合并到一个使用游标的脚本中。因此,我有一个带有光标的脚本和一个创建触发器的脚本(名为“trigEmpRaise”)。触发器是在没有错误的情况下创建的,但是当我使用光标运行脚本时(在创建触发器之前运行得很好),我得到了以下错误:

代码语言:javascript
代码运行次数:0
运行
复制
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

以下是表的说明:

代码语言:javascript
代码运行次数:0
运行
复制
    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

下面是脚本:带游标的脚本(触发触发器)

代码语言:javascript
代码运行次数:0
运行
复制
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;

和触发器脚本:

代码语言:javascript
代码运行次数:0
运行
复制
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中之后发生。

然而,无论我做什么,上述错误都会继续发生。有什么帮助吗?

EN

回答 1

Stack Overflow用户

发布于 2013-12-09 03:51:54

SELECT empno, ename, sal INTO vEMPNO, vENAME, vSAL FROM emp_prob1;必须恰好返回1行-不多也不少。

我的假设是你喜欢这样做:

代码语言:javascript
代码运行次数:0
运行
复制
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;
/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20456894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档