Oracel表格显示错误ORA-01422多个记录

问题描述 投票:0回答:1
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;
oracle plsql oracle11g oracle-sqldeveloper
1个回答
0
投票

代码的问题是,您的第一个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表匹配的所有记录。

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.