Проблема с вашим кодом заключается в том, что ваш первый запрос 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
из внутреннего подзапрос.
Ура !!