oracle存儲過程捕獲異常
⑴ oracle 插入時報錯 如何捕獲該處理異常。
這種情況我遇到過,可能的原因是表A和表B中對應欄位的數據值類型不同,建議檢查一下。
可以用EXCEPTION 來捕獲這個異常,並將捕獲到的異常存儲在一張表裡,以便查詢,這樣就不會中斷存儲過程的執行,舉例如下:
declare
...... -- 其他變數
V_ERRORCODE NUMBER; -- 錯誤代碼
V_ERRORMSG VARCHAR2(6000); -- 錯誤信息
V_INFORMATION VARCHAR2(6000); -- 提示信息
begin
...... --其他sql語句
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;
⑵ Oracle怎麼捕獲ora-00942的異常
不知道你想在什麼環境下捕獲,不知道你說的SQL是怎麼捕獲,或者你說的是腳本?
如果是在存儲過程中捕獲
有兩個思路吧,
1、直接使用普通的異常處理,獲取異常的代碼,匹配是否為00942,然後就捕獲到這個異常。
2、自定義異常處理,使用數據字典,首先查詢數據字典中是否存在這表,如果不存在,就產生一個自定義的異常,在這個異常里你做處理。
------------------------------------------------------------------------------------
declare
myexception exception;
--表個數
v_num integer :=0;
begin
--查詢表名為MY_USER表個數
SELECT count(*) into v_num FROM tabs WHERE table_name = 'MY_USER'
if v_num=0 then
raise myexception;
end if;
exception
when myexception then
raise_application_error(20001,'my exception happens');
when others then
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
end
----------------------------------------------------------------------------------------
偽代碼,你可以嵌到你的存儲過程中去使用。
⑶ oracle如何捕獲存儲過程報錯是哪一行
如果資料庫是10g及以上版本,可以使用dbms_utility.format_error_backtrace(),這個函數能夠返回錯誤行,可以套用以下格式:
create or replace procere prc_test(參數) 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;
這樣寫的好處是,當程序發成異常,唄exception捕獲後,就會列印出錯誤信息及發生錯誤的行號
⑷ oracle 存儲過程裡面有一條update語句會造成主鍵沖突 如何捕獲這個異常 取消這個update 繼續運行
使用begin end塊把update語句的異常捕獲後處理一下,就只會影響條記錄,而不是回滾整批數據。
⑸ 請教各位高手 oracle 存儲過程 如何將獲得捕獲異常的內容寫入一張表裡
可以先定義個變數,發生異常的時候將異常信息賦值給變數,插入表的時候用變數,
日誌表沒給表結構,我自己重新定義了一個,測試ok。
CREATE TABLE T_LOG_ERROR
(ERR_ID NUMBER,
ERR_TIME DATE,
ERR_CODE NUMBER,
ERR_INFOR VARCHAR2(4000)
);
create or replace procere p_testone is
v number(2);
v_sqlcode number;
v_sqlerrm varchar2(4000);
begin
select 1 / 0 into v from al;
--異常處理
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
v_sqlcode :=sqlcode;
v_sqlerrm :=SUBSTR(sqlerrm, 1, 2000);
insert into t_log_error values(1,sysdate,v_sqlcode,v_sqlerrm);
commit;
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM, 1, 200));
end;
執行存儲過程後就可以把異常信息記錄到表t_log_error了。