source

오라클 디버깅 기법

manycodes 2023. 11. 7. 20:59
반응형

오라클 디버깅 기법

오라클에서 트리거 디버깅에 어려움을 겪고 있습니다.현재 저는 오라클의 SQL 개발자 툴을 사용하고 있습니다.

트리거를 테스트하기 위해 테스트 창에 삽입하거나 삭제하지만 트리거 내부에서 무슨 일이 일어나고 있는지 볼 수 없습니다.방아쇠를 통과해서 방아쇠가 울릴 때 무슨 일이 일어나는지 보고 싶습니다.트리거 내부의 변수 값을 표시하기 위해 select 문을 사용하는 방법이 있습니까?

첫째, "여기서 시작"하지 마십시오. 더 구체적으로는 트리거를 사용하지 마십시오.각 행에 대해 트리거가 발생할 경우 트리거는 행 수준 처리로 강제 전환됩니다.논리는 본인이 부르는 저장 프로시저에 넣는 것이 좋습니다.그러면 시작(입력을 유효성 검사하는 곳)과 끝 및 논리 경로가 내내 표시됩니다.저장 프로시저는 한 경로를 따라가면 디버그하기가 훨씬 쉬워집니다.

둘째, 어떻게 다루어야 할지 모르는 오류를 절대로 테스트하지 마세요.만약 당신이 그것을 잡지 못하면, 그것은 무엇이 잘못되었는지(오류 메시지), 어디에 있는지(즉, 오류/콜 스택)를 말하는 오류 보고를 받는 클라이언트에게 거품을 내게 됩니다.그것을 잡으려고 하면, 그것을 어떻게 해야 하는지 알아야 합니다 (그리고 그것을 무시하는 경향을 모른다면 - 그것은 나쁜 것입니다).

마지막으로 선택 항목의 각 '계층'을 쉽게 볼 수 없습니다.설명 계획은 일반적으로 일이 어떻게 진행되고 있는지 알려줄 것입니다.v$session_longops가 현재 수행 중인 작업을 나타낼 수 있습니다.현재 대기 이벤트는 현재 작업 중인 테이블/블록/행에 대한 단서를 제공할 수 있습니다.

트리거를 디버그해야 하는 경우 간단히 사용할 수 있는 방법은 DBMS_OUTPUT을 사용하는 것입니다.

예.

SQL> CREATE OR REPLACE TRIGGER mytrigger
     BEFORE UPDATE ON mytable
     FOR EACH ROW
     ...
     BEGIN
       DBMS_OUTPUT.put_line('mytrigger STARTING');
       ... do some logic ...
       DBMS_OUTPUT.put_line('old=' || :OLD.mycolumn);
       DBMS_OUTPUT.put_line('new=' || :NEW.mycolumn);
       DBMS_OUTPUT.put_line('mytrigger FINISHED');
     END;
     /

SQL> SET SERVEROUT ON
SQL> UPDATE mytable SET mycolumn = mycolumn + 1;
2 rows updated.

mytrigger STARTING
old=10
new=11
mytrigger FINISHED
mytrigger STARTING
old=20
new=21
mytrigger FINISHED

나는 www.quest.com/toad/toad-for-oracle.aspx 에서 이용 가능한 퀘스트의 TADO라는 프로그램을 사용합니다.

위에 언급한 바와 같이 DBMS_OUTT는 매우 편리합니다.편집기에서 Output(출력) 창을 활성화해야 합니다.

PL/SQL은 코드의 "블록"에서 작동하며 EXECURE 키워드로 잡을 수 있습니다.

(포맷을 용서해주세요, 웹포맷을 어떻게 해야할지 잘 모르겠어요)

DECLARE
    C_DATE_FORMAT VARCHAR2(20) := 'DD-Mon-YYYY';
    C_TIME_FORMAT VARCHAR2(20) := 'HH24:MI:SS';
    C_NOT_IMPLEMENTED_CODE CONSTANT NUMBER(5) := -20200;
    C_NOT_IMPLEMENTED_MESSAGE CONSTANT VARCHAR2(255) := 'Not implemented';
    not_implemented EXCEPTION; -- user defined exception
BEGIN
    --RAISE not_implemented; -- raise user defined exception
    RAISE_APPLICATION_ERROR(C_NOT_IMPLEMENTED_CODE, C_NOT_IMPLEMENTED_MESSAGE); -- user defined exception
EXCEPTION -- exception block
    WHEN not_implemented THEN -- catch not_implemented exception
        DBMS_OUTPUT.PUT_LINE('Error: Not implemented');
    WHEN OTHERS THEN -- catch all other exceptions
        DBMS_OUTPUT.PUT_LINE('Error occured.');
        DBMS_OUTPUT.PUT_LINE('Date: ' || TO_CHAR(SYSDATE, C_DATE_FORMAT));
        DBMS_OUTPUT.PUT_LINE('Time: ' || TO_CHAR(SYSDATE, C_TIME_FORMAT));
        DBMS_OUTPUT.PUT_LINE('Error code: ' || SQLCODE);
        DBMS_OUTPUT.PUT_LINE('Error message: ' || SQLERRM); --deal with error
        RAISE; -- raise to calling object
END;

Oracle PL/SQL에서 DEBUG 트리거를 수행하려면 다음 단계를 따릅니다.

  1. Edit(편집) 옵션을 사용하여 트리거를 엽니다.라인 번호를 클릭하여 중단점을 설정합니다(아래 참조).
  2. 아래와 같이 테스트 창을 엽니다.
  3. 테이블에 대한 Write Insert/Update 쿼리입니다.(참고: 트리거는 업데이트/삽입 또는 둘 다에서 설정할 수 있습니다.)
  4. [디버거 시작] 단추를 누릅니다.

enter image description here

표에 값이 업데이트되는 즉시 해당 표가 업데이트됩니다.디버거가 트리거를 해줄 겁니다.디버깅을 계속할 수 있는 위치.

enter image description here

언급URL : https://stackoverflow.com/questions/3731918/oracle-debugging-techniques

반응형