當前位置:首頁 » 存儲配置 » oracle存儲過程捕獲異常

oracle存儲過程捕獲異常

發布時間: 2023-12-21 19:04:07

⑴ 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了。

熱點內容
ae加快緩存 發布:2024-11-28 23:50:34 瀏覽:341
java的版本號 發布:2024-11-28 23:48:18 瀏覽:99
sql存儲過程區別 發布:2024-11-28 23:35:37 瀏覽:918
ms計算機需要什麼配置 發布:2024-11-28 23:34:21 瀏覽:974
淘寶直接訪問的流量 發布:2024-11-28 23:33:11 瀏覽:49
python發微博 發布:2024-11-28 23:29:31 瀏覽:725
sql清空命令 發布:2024-11-28 22:58:53 瀏覽:487
melpython 發布:2024-11-28 22:49:54 瀏覽:211
伺服器瀏覽量什麼意思 發布:2024-11-28 22:49:09 瀏覽:965
可不可以同時安裝幾個編譯器 發布:2024-11-28 22:34:08 瀏覽:935