我仍在爲一家小型零售商店(一個場景,很幸運!)工作在這個數據庫上,目前正試圖用觸發器解決這個問題。Oracle - ORA-01422:精確提取返回的行數多於請求的行數
相關實體爲客戶,付款和訂單。支付是另外兩個之間的鏈接實體,因此一個客戶可以進行多筆付款,一個訂單可以有多筆付款(不常見但仍然可行),並且這一切都很好。
觸發:
CREATE OR REPLACE TRIGGER Check_Payment_Status
BEFORE UPDATE OF Order_Status ON Customer_Order
for each row
DECLARE paymentStatus payment.payment_status%type;
BEGIN
select payment.payment_status into paymentStatus
from payment
where order_no = :new.order_no;
IF (paymentStatus ='Failed' OR paymentStatus IS NULL) then
RAISE_APPLICATION_ERROR(-20103, 'The full payment has not been made so the order cannot be processed further until then.');
update customer_order set order_status='Delayed' where order_no= :new.order_no;
END IF;
IF (paymentStatus ='Successful') then
update payment set payment_date=SYSDATE where order_no= :new.order_no;
END IF;
END;
.
run
它目前工作好。基本上,在客戶的訂單可以被標記爲「分派」之前,付款狀態必須是「成功」的。如果它爲空或「失敗」,觸發器將會像「哦,不,你不! (但用更正式的話來說),這是按照預期工作的。但是,如果有人應用業務規則「訂單可以有多筆付款」,則觸發器需要檢查所有相關付款,這是我收到此錯誤的地方,因爲SELECT INTO
聲明打算僅返回一行。
我已經閱讀了一些光標,但我想我在這裏有點太過分了 - 有人會提出一些解決方案嗎?
如果您只是根據觸發器的名稱檢查付款狀態,爲什麼要在此處更新payment_date?這在這裏似乎不合適 - 您不會在您將payment_status設置爲成功的同一時間更新付款日期嗎? – DCookie