這個(gè)不太懂,你可以去CUUG上問下他們那的專業(yè)老師,態(tài)度都挺好的,或者加一些oracle技術(shù)群?jiǎn)枂?/p>
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了香洲免費(fèi)建站歡迎大家使用!
1、出現(xiàn)異常,會(huì)自動(dòng)回滾,不用為了回滾而捕獲異常
2、如需要對(duì)異常進(jìn)行處理,可參考以下異常捕獲邏輯
begin
--代碼處理邏輯。。。
exception
when?no_data_found?then
--no_data_found異常處理。。。
rollback;
when?others?then
--其他異常處理。。。
rollback;
以上。
這種情況我遇到過,可能的原因是表A和表B中對(duì)應(yīng)字段的數(shù)據(jù)值類型不同,建議檢查一下。
可以用EXCEPTION 來(lái)捕獲這個(gè)異常,并將捕獲到的異常存儲(chǔ)在一張表里,以便查詢,這樣就不會(huì)中斷存儲(chǔ)過程的執(zhí)行,舉例如下:
declare
...... -- 其他變量
V_ERRORCODE NUMBER; -- 錯(cuò)誤代碼
V_ERRORMSG VARCHAR2(6000); -- 錯(cuò)誤信息
V_INFORMATION VARCHAR2(6000); -- 提示信息
begin
...... --其他SQL語(yǔ)句
insert /*+ append */ into A select * from B;
exception
when others then
v_ErrorCode := SQLCODE;
v_ErrorMsg := SQLERRM;
v_Information := TO_CHAR(v_ErrorCode) || v_ErrorMsg ;
insert into T_ERR(code,mgs,info) values(v_ErrorCode,v_ErrorMsg,v_Information);
commit;
end;
--通過sqlcode , sqlerrm 這兩個(gè)內(nèi)置變量來(lái)查看,例如:
DECLARE
--聲明異常
some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition
v_ErrorCode NUMBER; -- Variable to hold the error message code
v_ErrorText VARCHAR2(200); -- Variable to hold the error message text
BEGIN
--...
--拋出異常
IF ( ... ) THEN --(括號(hào)內(nèi)填拋出異常的條件)
RAISE some_kinds_of_err;
END IF;
--...
EXCEPTION
--捕捉異常
WHEN some_kinds_of_err THEN
/* do something to Handler the errors */
null;
--捕捉其他異常,并獲得 捕獲異常的內(nèi)容
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- Note the use of SUBSTR here.
dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/
/**
sqlcode 就是錯(cuò)誤代碼
sqlerrm 就是sql錯(cuò)誤信息。注意用substr來(lái)截取,否則輸出很難看。
**/
一般寫在存儲(chǔ)過程處理異常。
exception
when others then
out_mes:=out_mes || '執(zhí)行失??!因?yàn)?|| sqlcode || '錯(cuò)誤' ;
out_mes你自己可以處理,插入日志表中 或作為輸出參數(shù)。
如果數(shù)據(jù)庫(kù)是10g及以上版本,可以使用dbms_utility.format_error_backtrace(),這個(gè)函數(shù)能夠返回錯(cuò)誤行,可以套用以下格式:
create or replace procedure prc_test(參數(shù)) is
v_no number;
begin
select no into v_no from zrp;
exception
when others then
dbms_output.put_line('SQL CODE:'||sqlcode||chr(10)||
sqlerrm||chr(10)||
dbms_utility.format_error_backtrace());
end;
這樣寫的好處是,當(dāng)程序發(fā)成異常,唄exception捕獲后,就會(huì)打印出錯(cuò)誤信息及發(fā)生錯(cuò)誤的行號(hào)