[英]PL/SQL exception handling
我對PL / SQL編程還很陌生,並且過去2個小時一直在嘗試解決此問題
這是我的代碼
CREATE OR REPLACE PROCEDURE xx_upd_new_code AS
CURSOR c1 IS
SELECT
eite.t_ep_item_ep_id,
bite.main_item
FROM bidw.item@demantra bite,
t_ep_item eite
WHERE bite.item_code = eite.item
AND bite.main_item = bite.old_code
AND bite.current_flag = 1
AND bite.main_item IS NOT NULL;
a1 c1%ROWTYPE;
BEGIN
xx_dbex('Starts.', 'xx_upd_new_code', 'XX');
OPEN c1;
LOOP
FETCH c1 INTO a1;
EXIT WHEN c1%NOTFOUND;
xx_dbex('Item: ' || a1.main_item, 'xx_upd_new_code', 'XX');
UPDATE t_ep_item
SET item = a1.main_item
WHERE t_ep_item_ep_id = a1.t_ep_item_ep_id;
COMMIT;
xx_dbex('Ends.', 'xx_upd_new_code', 'XX');
END LOOP;
EXCEPTION
WHEN OTHERS THEN xx_dbex('Error.', 'xx_upd_new_code', 'XX');
END xx_upd_new_code;
每當遇到錯誤時,過程都會結束,但我希望它移至下一個項目。 xx_debex是存儲日志的過程。
我一直在谷歌搜索,發現我可以寫兩個異常並且可以在條件不滿足的情況下引發異常。我嘗試了一下,但是它拋出一個錯誤標識符,必須聲明一個標識符項,必須聲明
CREATE OR REPLACE PROCEDURE xx_upd_new_code AS
CURSOR c1 IS
SELECT
eite.t_ep_item_ep_id,
bite.main_item
FROM bidw.item@demantra bite,
t_ep_item eite,
items ite
WHERE bite.item_code = eite.item
AND bite.main_item = bite.old_code
AND bite.current_flag = 1
AND bite.main_item IS NOT NULL;
a1 c1%ROWTYPE;
BEGIN
xx_dbex('Starts.', 'xx_upd_new_code', 'XX');
OPEN c1;
LOOP
FETCH c1 INTO a1;
EXIT WHEN c1%NOTFOUND;
IF item != a1.main_item THEN
xx_dbex('Item: ' || a1.main_item, 'xx_upd_new_code', 'XX');
UPDATE t_ep_item
SET item = a1.main_item
WHERE t_ep_item_ep_id = a1.t_ep_item_ep_id;
COMMIT;
xx_dbex('Ends.', 'xx_upd_new_code', 'XX');
ELSE
RAISE a;
END IF;
END LOOP;
EXCEPTION
WHEN a THEN xx_dbex('Error.', 'xx_upd_new_code', 'XX');
WHEN OTHERS THEN NULL;
END xx_upd_new_code;
另外,在寫它的地方,我可以寫在兩個不同的塊中
CREATE OR REPLACE PROCEDURE xx_upd_new_code AS
CURSOR c1 IS
SELECT
eite.t_ep_item_ep_id,
bite.main_item
FROM bidw.item@demantra bite,
t_ep_item eite
WHERE bite.item_code = eite.item
AND bite.main_item = bite.old_code
AND bite.current_flag = 1
AND bite.main_item IS NOT NULL;
a1 c1%ROWTYPE;
BEGIN
xx_dbex('Starts.', 'xx_upd_new_code', 'XX');
BEGIN
EXCEPTION
WHEN OTHERS THEN xx_dbex('Error', 'xx_upd_new_code', 'XX');
END;
OPEN c1;
LOOP
FETCH c1 INTO a1;
EXIT WHEN c1%NOTFOUND;
xx_dbex('Item: ' || a1.main_item, 'xx_upd_new_code', 'XX');
UPDATE t_ep_item
SET item = a1.main_item
WHERE t_ep_item_ep_id = a1.t_ep_item_ep_id;
COMMIT;
END LOOP;
EXCEPTION WHEN OTHERS THEN
xx_dbex('END', 'xx_upd_new_code', 'XX');
END xx_upd_new_code;
我仍然無法弄清楚。
將光標循環分為兩個部分/塊。 第一個用於調用日志記錄過程的部分,另一個用於更新表的部分。 您的代碼主體應如下所示:
BEGIN
Open C1;
loop
fetch C1 into A1;
exit when C1%NOTFOUND
BEGIN
xx_dbex('Item: '||a1.main_item ,'xx_upd_new_code', 'XX');
END;
BEGIN
UPDATE t_ep_item
SET item = a1.main_item
where t_ep_item_ep_id=a1.t_ep_item_ep_id;
COMMIT;
xx_dbex('Ends.','xx_upd_new_code', 'XX');
EXCEPTION
WHEN OTHERS THEN
xx_dbex('Ends.','ERROR', 'XX');
END;
END LOOP;
希望你明白
只需將循環內的語句封裝到一個新的pl / sql塊中,如下所示:
loop
begin
fetch ...
exception
when ...
end;
end loop;
順便說一句。 日志記錄過程應使用pragma_autonomous_transaction
並commit
獨立於當前事務結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.