Я получаю эту ошибку, я не могу понять, что не так - PullRequest
0 голосов
/ 25 июня 2018

ORA-01422: точное извлечение возвращает больше запрошенного числа строк ORA-06512: в строке 19 01422. 00000 - «точное извлечение возвращает запрошенное количество строк» ​​* Причина: число, указанное в точном извлечениименьше возвращаемых строк.

* Действие: перепишите запрос или измените количество запрошенных строк


Это мой код.это всегда дает мне одну и ту же проблему, и я не понимаю, как ее решить.Кто-то, помогите мне, пожалуйста.

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;

1 Ответ

0 голосов
/ 25 июня 2018

Сообщение об ошибке - Точная выборка возвращает больше запрошенного количества строк

Что это значит - вы пытаетесь сохранить несколько строк в одну переменную.

Например - 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 = количество записей в таблице - vendedor .

Чтобы лучше понять сообщение об ошибке, вы можете запустить приведенный ниже код, который поможет вам отладить проблемы.

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 - это простой способ перехвата исключений, но не очень хорошая вещь для использования в рабочем коде :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...