使用error stack診斷特定錯誤資訊

來源:互聯網
上載者:User

在實際應用開發中,我們有很多精力傾注在偵錯工具和異常情況的排查上。使用設計邏輯和情境開發的代碼,經常被生產資料一次次的“攻破”。快速的定位錯誤資料和報錯語句是我們提高工作效率的關鍵。本篇介紹使用Oracle的event, 'error');" error stack方法來定位程式包中報錯的SQL和取值。

1、情境展現

我們選擇Oracle 11g來進行實驗。

SQL> select * from v$version where rownum<3;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 – Production

資料表T包括object_id和object_name列。其中object_id為主鍵列。

SQL> create table t (object_id number, object_name varchar2(100));

Table created

SQL> alter table t add constraint pk_t primary key (object_id);

Table altered

灌入一部分基礎資料,作為原始值。

SQL> insert into t select object_id, object_name from dba_objects where wner='SCOTT';

20 rows inserted

SQL> commit;

Commit complete

為了進行實驗,我們建立一個procedure程式段,從dba_objects中選取資料插入到資料表T中。程式定義如下:

SQL> create or replace procedure P_ERRORSTACK_TEST

2 is

3 type t_objs_list is table of dba_objects%rowtype index by binary_integer;

4 t_obj_infos t_objs_list;

5 begin

6  select *

7  bulk collect into t_obj_infos

8  from dba_objects;

9

10  if (t_obj_infos.count<>0) then

11      for i in t_obj_infos.first..t_obj_infos.last loop

12          insert into t

13          values (t_obj_infos(i).object_id, t_obj_infos(i).object_name);

14      end loop;

15  end if;

16 end P_ERRORSTACK_TEST;

17 /

Procedure created

注意三個細節:首先,我們是逐條進行資料的插入動作的,而不是insert into select方式。第二,我們在for迴圈裡面插入資料,迴圈次數多,實際上不能逐條進行檢查判斷。第三,我們插入的是dba_objects所有的資料,必然一部分插入資料和未經處理資料表中存在主鍵衝突的情況。

實際執行中,報錯。

SQL> exec P_ERRORSTACK_TEST;

begin P_ERRORSTACK_TEST; end;

ORA-00001:違反唯一約束條件(SCOTT.PK_T)

ORA-06512:在"SCOTT.P_ERRORSTACK_TEST", line 12

ORA-06512:在line 1

有過調試和測試經驗的朋友們非常熟悉這樣的情景。大批量資料測試的時候,預存程序作業包括成千上萬相同或者不同的SQL,執行資料海量。執行半天之後,報錯。類似的錯誤還有如長度(數字字串)超過限制、將空值null插入到非空限制欄位,違反外鍵約束等等。

這樣的原因無非幾種,一是程式的Bug,開發人員沒有考慮到業務情境,一般出現在null值計算結果null上。其二是設計問題,業務人員和設計人員沒有考慮到當前這樣的異常情境。最後也是比較麻煩的,就是測試資料來源有問題,需要進行額外清理工作。

無論原因是上述哪種,有兩件事情是必須做到,是哪句SQL報錯,報錯的資料參數值是什麼。

當然,我們可以認為加入調試代碼來輸入執行過程,從而實現定位。我們更方便的是使用error stack的診斷事件方法來進行定位。

SPFILE 錯誤導致資料庫無法啟動(ORA-01565)

ORA-01172、ORA-01151錯誤處理

ORA-00600 [2662]錯誤解決

ORA-01078 和 LRM-00109 報錯解決方案

 

更多詳情請繼續閱讀第2頁的精彩內容:

 

  • 1
  • 2
  • 下一頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.