Jul
28
2009
Error Debug กับ FORMAT_ERROR_BACKTRACE
Written by Administrator   

     เพิ่งจะได้ มีโอกาสได้รู้จัก Package   DBMS_UTILITY.FORMAT_ERROR_BACKTRACE    ไม่รู้ว่า เชยไปหรือเปล่า เพราะว่า มีให้ใช้ตั้งแต่  Oracle 10g  
   จากเหตุที่อยากหาฟังก์ชันที่ทำหน้าที่  จับ Error  และ บอกบรรทัดให้หน่อย ว่า Error ที่บรรทัดไหน   และที่สำคัญ  ต้องบอกได้ว่า มัน Error ที่ Procedure ไหน หรือ Function ไหนได้ด้วย
  ปกติเวลาเขียน โปรแกรม  Procedure ที่เขียนขึ้นมาเรียกกันหลายระดับ  กว่าจะรู้ว่ามัน Error ที่จุดไหน ใช้เวลาไปพักใหญ่ๆ ทีเดียว ยิ่งไปกันใหญ่ถ้าเป็น Error ประเภทลักปิดลักเปิด  เด๊่ยวดีเดี๋ยวร้าย (ไม่รู้ใครเขียนโปรแกรมแล้วเจอแบบนี้บ้าง  หุหุ)
 
   เหมือนฟ้ามาโปรด   เมื่อไปเปิดเจอ DBMS_UTILITY.FORMAT_ERROR_BACKTRACE  สามารถช่วยได้จริงๆ
  โดยทั่วไป  ใน PL/SQL การเขียนเพื่อดักจับ Error  จะใช้ 2 Function คือ  SQLCODE   และ SQLERRM  ซึ่งทำหน้าที่บอก Error Code  และ Error Message  เท่านั้น


  ลองดูตามตัวอย่างนะครับ
    1. สร้าง  Procedure ที่มี Error ก่อน  ชื่อว่า p_error
SQL> CREATE OR REPLACE PROCEDURE p_error
  2  IS
  3     x   NUMBER;
  4     y   VARCHAR2 (10);
  5  BEGIN
  6     x := 10;
  7     y := 'A';
  8     x := y;    (Error  ตรงนี้  )
  9     y := 'B';
 10  EXCEPTION
 11     WHEN OTHERS
 12     THEN
 13        DBMS_OUTPUT.PUT_LINE (SQLERRM);   
 14  END;
 15  /
 Procedure created.
 2.    สร้าง Procedure อีกอัน เพื่อเรียกใช้ p_error  คือ    p_call_proc
SQL> CREATE OR REPLACE PROCEDURE p_call_proc
  2  IS
  3  BEGIN
  4     p_error;
  5  END;
  6  /

Procedure created.

3.   ลองสั่ง Run  
SQL> exec p_call_proc
ORA-06502: PL/SQL: numeric or value error: character to number conversion error

PL/SQL procedure successfully completed.

แจ้ง  Message  อย่างเดียว  หาไปเหอะ  ไล่ code ไปเลยนะ  มัน Error  แน่นอน


ลองเพิ่ม DBMS_OUTPUT.PUT_LINE( DBMS_UTILITY.FORMAT_ERROR_BACKTRACE );

SQL> CREATE OR REPLACE PROCEDURE p_error
  2  IS
  3     x   NUMBER;
  4     y   VARCHAR2 (10);
  5  BEGIN
  6     x := 10;
  7     y := 'A';
  8     x := y;
  9     y := 'B';
 10  EXCEPTION
 11     WHEN OTHERS
 12     THEN
 13        DBMS_OUTPUT.PUT_LINE (SQLERRM);
 14        DBMS_OUTPUT.PUT_LINE( DBMS_UTILITY.FORMAT_ERROR_BACKTRACE );
 15  END;
 16  /

Procedure created.

ลอง  Run ดูอีกที
 SQL> exec p_call_proc;
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SCOTT.P_ERROR", line 8

เย้ๆๆ  รู้แล้วว่า มี Error เกิดขึ้นที่ Procedure  ไหน  บรรทัดที่เท่าไหร่    ก็ตามไปแก้ในจุดที่ Error แจ้งมา
  รู้สึกว่า โลกนี้น่าอยู่ขึ้นอีกเยอะ 5555 (ว่าไปนั่น)    แค่นี้ก็ช่วยให้โปรแกรมเมอร์หา Bug ได้ง่ายขึ้นแล้วล่ะครับ

Comments
Add New Search
lookpranoi     |203.147.15.xxx |2014-05-17 00:05:16
เยี่ยมไปเลย ครับ
Write comment
Name:
Email:
 
Website:
Title:
UBBCode:
[b] [i] [u] [url] [quote] [code] [img] 
 
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Please input the anti-spam code that you can read in the image.

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."