解決儲存過程擷取錯誤的問題
今天遇到一個問題 下發的儲存過程有時候會出現 "無效rowid"或者"物件不再存在"的問題,而一旦發生這種錯誤,則儲存過程當中的 EXCEPTION 無法擷取到錯誤.過程指令碼如下:
CREATE OR REPLACE PROCEDURE SP_TEST
AUTHID CURRENT_USER
AS
T_log_id NUMBER(20);
T_err_msg VARCHAR(100);
BEGIN
BEGIN
SELECT seq_run_log.NEXTVAL INTO T_log_id from dual;
execute immediate 'insert into log_table (row_id,start_date,table_name) values (:1,sysdate,''TEST_ZYP'')'
using T_log_id;
commit;
--巢狀儲存過程 判斷TEST_ZYP表是否存在,存在則丟棄.
drop_temp_table('TEST_ZYP');
execute immediate '
create table TEST_ZYP nologging as select * from test_zyp@dblink_etl';
commit;
---寫入結束日誌
execute immediate 'update log_table set row_num=(select count(*) from TEST_ZYP) where row_id=:1'
Using T_log_id;
commit;
EXCEPTION
WHEN OTHERS
THEN
T_err_msg := SQLERRM;
Execute Immediate '
update log_table Set END_DATE=SYSDATE,STATE=''2'',ERROR_DEPICT=:1 WHERE ROW_ID=:2'
using T_err_msg,T_log_id;
commit;
END SP_TEST;
問題就出在結束日誌這裡,因為最後更新日誌表log_table的時候,由於表本身出現了錯誤,因此導致整個update語句報錯,並且丟擲錯誤,從而在每天的例行檢查當中無法發現到底出現了什麼錯誤,同時也不好向局方說明情況.因此作出瞭如下改動.
CREATE OR REPLACE PROCEDURE SP_TEST
AUTHID CURRENT_USER
AS
T_log_id NUMBER(20);
T_err_msg VARCHAR(100);
t_tab_ext NUMBER(1);
BEGIN
BEGIN
SELECT seq_run_log.NEXTVAL INTO T_log_id from dual;
execute immediate 'insert into log_table (row_id,start_date,table_name) values (:1,sysdate,''TEST_ZYP'')'
using T_log_id;
commit;
drop_temp_table('TEST_ZYP');
execute immediate '
create table TEST_ZYP nologging tablespace REPORT as select * from test_zyp@dblink_etl';
COMMIT;
execute immediate '
analyze table TEST_ZYP validate structure';
---寫入結束日誌
execute immediate 'update log_table Set END_DATE=SYSDATE,STATE=''1''
WHERE ROW_ID=:1'
Using T_log_id;
commit;
EXCEPTION
WHEN OTHERS
THEN
T_err_msg := SQLERRM;
execute immediate '
update log_table Set END_DATE=SYSDATE,STATE=''2'',ERROR_DEPICT=:1 WHERE ROW_ID=:2'
using T_err_msg,T_log_id;
commit;
end;
begin
select count(1) into t_tab_ext from log_table where state='1' and row_id=''||T_log_id||'';
end;
if t_tab_ext =1 then
begin
execute immediate 'update log_table set row_num=(select count(*) from TEST_ZYP) where row_id=:1'
using T_log_id;
commit;
end;
end if;
END SP_TEST;
由此就達到了擷取錯誤的目的,同時需要說明的是 number型的變數在引用的時候必須要用兩個引號 例如 ''||T_log_id||'' 否則會被作為varchar型變數而出錯;同時給t_tab_ext變數賦值 還必須是要在EXCEPTION end之後 否則不會執行賦值的操作.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12216142/viewspace-492377/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle儲存過程!解決網友問題Oracle儲存過程
- 儲存過程問題。。儲存過程
- 一個儲存過程的問題!儲存過程
- 解決cookies儲存中文報錯問題Cookie
- 儲存過程中DDL錯誤一例儲存過程
- mysql多次呼叫儲存過程的問題MySql儲存過程
- Java呼叫Oracle儲存過程的問題JavaOracle儲存過程
- 應用儲存過程執行報錯解決方案儲存過程
- MySQL儲存過程詳解 mysql 儲存過程MySql儲存過程
- 儲存過程單引號問題儲存過程
- JAVA儲存過程出現ORA-24345錯誤Java儲存過程
- 儲存過程ORA-04068之錯誤解析儲存過程
- MySQL儲存過程的許可權問題MySql儲存過程
- Hibernate呼叫oracle儲存過程的問題Oracle儲存過程
- plsqlDevloper 儲存過程的除錯SQLdev儲存過程除錯
- 一個 ExpressionChangedAfterItHasBeenCheckedError 錯誤的解決過程ExpressError
- 儲存過程的詳解儲存過程
- MySQL儲存過程詳解 mysql 儲存過程linkMySql儲存過程
- 通過IPFS技術解決NFT的永久儲存問題
- ORACLE中儲存過程的許可權問題Oracle儲存過程
- MySQL儲存過程中的sql_mode問題MySql儲存過程
- java儲存過程呼叫servlet的授權問題Java儲存過程Servlet
- 解決 ngrok 的 Domain 錯誤問題AI
- 儲存過程效能低的解決方法之一儲存過程
- Oracle儲存過程編譯卡死的解決方法Oracle儲存過程編譯
- 快取過程存在的三大問題及解決方案快取
- 儲存過程誤刪除的恢復儲存過程
- ORA-2049錯誤解決過程
- MySQL 建立儲存過程報錯MySql儲存過程
- 儲存過程訪問其他使用者的表的問題儲存過程
- Oracle 編譯儲存過程卡死解決方法Oracle編譯儲存過程
- 關於儲存過程中不能操作其他使用者表資料的問題解決儲存過程
- Enterprise Library- Data Block使用oracle儲存過程出現問題的解決BloCOracle儲存過程
- ORA-600(17069)錯誤的解決過程
- mongo 儲存過程詳解Go儲存過程
- mysql儲存過程詳解MySql儲存過程
- 儲存過程被鎖無法編譯的解決儲存過程編譯
- 偶發的儲存過程呼叫效能問題的一次調優過程儲存過程