Слишком много строк, но выбрана только одна

У меня есть эта процедура, которая просто удаляет строку на основе поля столбца с именем AppID, Эта процедура получает значение из другого столбца с именем AppNbr на основе этих строк AppID колонка. Процедура терпит неудачу с TOO_MANY_ROWS исключение, когда он пытается SELECT строка. Это PL/SQL:

DECLARE
    lvnApplNbr NUMBER;

    PROCEDURE deleteAppl(applId IN VARCHAR2) IS
    BEGIN
        BEGIN
            SELECT ApplNbr -- Exception thrown here
            INTO lvnApplNbr
            FROM Appl
            WHERE ApplID = applId;
        EXCEPTION
            WHEN TOO_MANY_ROWS THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM);
        END;
        -- ... Delete it after some logic
    END; -- End Procedure
BEGIN
    ...
    deleteAppl('571E00BA-70E6-4523-BEAC-4568C3DD1A7D');
    ...
END;

TOO_MANY_ROWS исключение выдается, когда оно SELECT INTOs. Я понятия не имею, почему он выдает эту ошибку, потому что если я просто запросить это:

SELECT ApplNbr FROM Appl WHERE ApplId = '571E00BA-70E6-4523-BEAC-4568C3DD1A7D';

Только один ряд вернется с правильным ApplId,

Что здесь происходит?

1 ответ

Решение

Просто используйте псевдоним для связанной таблицы (Appl):

   PROCEDURE deleteAppl(applId IN VARCHAR2) IS
   .....
   .....
   SELECT ApplNbr 
    INTO lvnApplNbr
    FROM Appl a
    WHERE a.ApplID = applId;
   ......

или измените имя вашего параметра (applId) к другому имени, такому как i_applId:

   PROCEDURE deleteAppl(i_applId IN VARCHAR2) IS
   .....
   .....
   SELECT ApplNbr 
    INTO lvnApplNbr
    FROM Appl
    WHERE ApplID = i_applId;
   ......

Потому что в вашем случае множественное соответствие воспринимается, если ваш parameter's name а также column name идентичны

Другие вопросы по тегам