【问题标题】:I get keep getting this error I can't figure out what is wrong我不断收到此错误,我无法弄清楚出了什么问题
【发布时间】:2018-12-03 13:19:27
【问题描述】:

ORA-01422:精确提取返回的行数多于请求的行数 ORA-06512:在第 19 行 01422. 00000 - “精确提取返回的行数超过了请求的行数” *原因:exact fetch中指定的数量小于返回的行数。

*操作:重写查询或更改请求的行数


这是我的代码。它总是给我同样的问题,我不明白如何解决它。请有人帮助我。

VARIABLE b_colacion NUMBER;
VARIABLE b_locomocion NUMBER;

EXECUTE  :b_colacion := 8000;
EXECUTE  :b_locomocion := 12000;

DECLARE
v_min_ven NUMBER;
v_max_ven NUMBER;
v_id_vendedor NUMBER;
v_sueldo_base NUMBER;
v_annos_contratado NUMBER(2);
v_valor_asig_annos NUMBER(8):=0;

BEGIN

SELECT MIN(id_vendedor) , MAX(id_vendedor) 
INTO v_min_ven , v_max_ven 
FROM vendedor;

WHILE v_min_ven <= v_max_ven

 LOOP

SELECT id_vendedor , sueldo_base , TO_CHAR(SYSDATE , 'YYYY') - TO_CHAR(fecha_contrato , 'YYYY')
INTO v_id_vendedor , v_sueldo_base , v_annos_contratado
FROM vendedor
ORDER BY id_vendedor ASC;


IF v_annos_contratado > 0 THEN
SELECT ROUND(v_sueldo_base * (porc_asignado_contr/100))
INTO v_valor_asig_annos
FROM porc_bonif_annos_contrato
WHERE v_annos_contratado BETWEEN annos_inf AND annos_sup;

END IF;

 INSERT INTO HABERES_CALCULADOSOS 
 VALUES(v_min_ven , :b_colacion , :b_locomocion , v_valor_asig_annos);


 COMMIT;

 END LOOP;

END;

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    错误消息 - 精确提取返回的行数超过了请求的行数

    这意味着 - 你试图将多行保存到一个变量中。

    例如 - SELECT id_vendedor , sueldo_base , TO_CHAR(SYSDATE , 'YYYY') - TO_CHAR(fecha_contrato , 'YYYY') INTO v_id_vendedor , v_sueldo_base , v_annos_contratado FROM vendedor ORDER BY id_vendedor ASC; 将返回 N 行数,其中 N = 表中的记录数 - 供应商。

    为了更好地理解错误信息,您可以运行以下代码,这将帮助您调试问题。

    VARIABLE b_colacion NUMBER;
    VARIABLE b_locomocion NUMBER;
    
    EXECUTE  :b_colacion := 8000;
    EXECUTE  :b_locomocion := 12000;
    
    DECLARE
        v_min_ven NUMBER;
        v_max_ven NUMBER;
        v_id_vendedor NUMBER;
        v_sueldo_base NUMBER;
        v_annos_contratado NUMBER(2);
        v_valor_asig_annos NUMBER(8):=0;
    
    BEGIN
    
        BEGIN
            SELECT MIN(id_vendedor) , MAX(id_vendedor) 
            INTO v_min_ven , v_max_ven 
            FROM vendedor;
        EXCEPTION
        WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('Exception in the above Select Statment : ' || SQLERRM);
        END;
    
        WHILE v_min_ven <= v_max_ven
    
         LOOP
            BEGIN
                SELECT id_vendedor , sueldo_base , TO_CHAR(SYSDATE , 'YYYY') - TO_CHAR(fecha_contrato , 'YYYY')
                INTO v_id_vendedor , v_sueldo_base , v_annos_contratado
                FROM vendedor
                ORDER BY id_vendedor ASC;
            EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('Exception in the above Select Statement : ' || SQLERRM);
            END;
    
            IF v_annos_contratado > 0 THEN
                BEGIN
                    SELECT ROUND(v_sueldo_base * (porc_asignado_contr/100))
                    INTO v_valor_asig_annos
                    FROM porc_bonif_annos_contrato
                    WHERE v_annos_contratado BETWEEN annos_inf AND annos_sup;
                EXCEPTION
                WHEN OTHERS THEN
                    DBMS_OUTPUT.PUT_LINE('Exception in the above Select Statement : ' || SQLERRM);
                END;
            END IF;
    
            INSERT INTO HABERES_CALCULADOSOS 
            VALUES(v_min_ven , :b_colacion , :b_locomocion , v_valor_asig_annos);
            COMMIT;
    
        END LOOP;
    END;
    

    您想要捕获的异常是 - WHEN TOO_MANY_ROWS THEN

    只是让你知道,WHEN OTHERS 是一种捕获异常的简单方法,但在生产代码中使用并不是一件好事 :)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2017-06-15
    相关资源
    最近更新 更多