Oracle Форма с ошибкой ORA-01422 более одной записи - PullRequest
0 голосов
/ 06 января 2020
IF :CUSTOMER_ID IS NOT NULL AND :BRANCH_ID IS NOT NULL THEN
    DECLARE
        X_NO           NUMBER;
        X_VOUCHER_ID   NUMBER;
    BEGIN
        SELECT
            GL_VOUCHER_ID
        INTO X_VOUCHER_ID
        FROM
            SM_SALES_INVOICES SI,
            AR_CUSTOMERS AC,
            GL_VOUCHERS GV
        WHERE
            AC.CUSTOMER_ID = SI.CUSTOMER_ID
            AND SI.GL_VOUCHER_ID = GV.VOUCHER_ID
            AND SI.CUSTOMER_ID = :CUSTOMER_ID;

        UPDATE GL_VOUCHERS
        SET
            BRANCH_ID = :NEW_BRANCH_ID
        WHERE
            VOUCHER_ID = X_VOUCHER_ID;

        MESSAGE('Branch is changed sucessfully!');
        MESSAGE('Branch is changed sucessfully!');
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            NULL;
    END;

    COMMIT;
ELSE
    MESSAGE('Please Enter Both Fields!');
    MESSAGE('Please Enter both Fields!');
END IF;

1 Ответ

2 голосов
/ 06 января 2020

Проблема с вашим кодом заключается в том, что ваш первый запрос SELECT возвращает несколько записей, и вы пытаетесь сохранить несколько результатов в одной переменной X_VOUCHER_ID.

Вам необходимо обновить таблицу GL_VOUCHERS без сохранения GL_VOUCHER_ID в X_VOUCHER_ID следующим образом:

IF :CUSTOMER_ID IS NOT NULL AND :BRANCH_ID IS NOT NULL THEN
    DECLARE
        X_NO           NUMBER;
        -- removed following variable
        -- X_VOUCHER_ID   NUMBER;
    BEGIN
    --REMOVED THIS SELECT CLAUSE
    --        SELECT
    --            GL_VOUCHER_ID
    --        INTO X_VOUCHER_ID
    --        FROM
    --            SM_SALES_INVOICES SI,
    --            AR_CUSTOMERS AC,
    --            GL_VOUCHERS GV
    --        WHERE
    --            AC.CUSTOMER_ID = SI.CUSTOMER_ID
    --            AND SI.GL_VOUCHER_ID = GV.VOUCHER_ID
    --            AND SI.CUSTOMER_ID = :CUSTOMER_ID;
        UPDATE GL_VOUCHERS
        SET
            BRANCH_ID = :NEW_BRANCH_ID
        WHERE
            VOUCHER_ID IN ( -- ADDED THIS IN CLAUSE
                SELECT
                    GL_VOUCHER_ID
                FROM
                    SM_SALES_INVOICES SI,
                    AR_CUSTOMERS AC,
                    GL_VOUCHERS GV
                WHERE
                    AC.CUSTOMER_ID = SI.CUSTOMER_ID
                    AND SI.GL_VOUCHER_ID = GV.VOUCHER_ID
                    AND SI.CUSTOMER_ID = :CUSTOMER_ID
            );

        MESSAGE('Branch is changed sucessfully!');
        MESSAGE('Branch is changed sucessfully!');
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            NULL;
    END;

    COMMIT;
ELSE
    MESSAGE('Please Enter Both Fields!');
    MESSAGE('Please Enter both Fields!');
END IF;

Приведенный выше код обновит все записи таблицы GL_VOUCHERS, которая соответствует GL_VOUCHER_ID из внутреннего подзапрос.

Ура !!

...