2013-02-26 4 views
1

나는 많은 레거시 plsql 코드를 늦게 사용하고있다. 아래 코드와 같은 debug 문을 볼 수 있습니다. 디버그 모드가 OFF 일 때 프로 시저 호출의 오버 헤드를 피하기 위해 'if'검사가 추가되었습니다.plsql 코드의 디버그 문

IF (Debug mode is on) THEN 
    Debug_pkg.logmsg(l_module_name,'Unexpected error : '|| SQLERRM, FND_LOG.LEVEL_WARNING); 
END IF; 

디버그 문을 한 줄로 작성하는 방법이 있습니까? C에서는 절차상의 오버 헤드를 피하는 데 유용한 매크로가 있습니다. plsql 코드에서 비슷한 것을 할 수 있습니까?

편집 : 내 질문 몇 가지를 혼동했을 수도 있기 때문에 좀 더 세부 사항을 추가

. 내가 피하려고하는 것은 하나의 디버그 문을 출력하기 위해 3 줄을 쓰는 것이다. 매크로를 사용하여 한 줄에 디버그 문을 작성할 수 있습니까? 이유는 무엇입니까? 이러한 문장이 장소 전체에 추가되면 혼란이 발생하고 가독성이 떨어집니다. 단 한 줄만 입력하면 각 디버그 문에 3 줄이 표시됩니다.

두 번째 편집 :

아래 내 대답을 추가했습니다.

+0

수정하여 접근 방식을 대답으로 옮길 수 있습니까? – Sathya

+0

@Sathya - 내 대답을 아래에 추가했습니다. – plspl

답변

0

저스틴 케이브의 http://www.oracle-developer.net/display.php?id=502 링크를 이용해 주셔서 감사합니다. 나는 지금 당장이 일을 끝냈다.

PROCEDURE debug_msg(txt VARCHAR2) 
    IS 
    BEGIN 
     IF (debug mode is on) THEN 
     debug_pkg.logmsg('Module', txt , LEVEL_WARNING); 
     END IF; 
    END; 

위의 절차를 인라인하려면, 이렇게해야한다.

PRAGMA INLINE(debug_msg, 'YES');  

그러나 인라인은 컴파일러에 대한 요청 일 뿐이지 만 인라인 될 수도 있고 그렇지 않을 수도 있습니다. 또한, 인라인되는 프로시 저는 동일한 패키지에 정의되어야합니다.

+0

"디버그 모드"가 무엇인지 궁금합니다. 그것은 유효한 pl/sql 표현식입니까 아니면 의사 코드 – schurik

+0

입니까? 단지 디버그 모드가 켜져 있는지를 결정하는 변수/표현식을 나타내는 의사 코드입니다. – plspl

3

사용중인 Oracle 버전에 따라 conditional compilation in PL/SQL을 사용할 수 있습니다.

$IF $$debug_mode 
$THEN 
    Debug_pkg.logmsg(l_module_name,'Unexpected error : '|| SQLERRM, FND_LOG.LEVEL_WARNING); 
$END 
$debug_mode이 세션의 PLSQL_CCFLAGS 설정에서 설정

또는 package_name.debug_mode 코드는 디버그 모드에서 컴파일해야하는지 여부를 나타내는 패키지 레벨 변수입니다

$IF package_name.debug_mode = 1 
$THEN 
    Debug_pkg.logmsg(l_module_name,'Unexpected error : '|| SQLERRM, FND_LOG.LEVEL_WARNING); 
$END 

비슷 해요.

다시 사용중인 Oracle 버전에 따라 debug_pkg.logmsg에 디버그 모드 검사를 넣고 컴파일러를 사용하여 호출을 인라인하는 것이 유리하다고 자동 결정할 수 있습니다 (프로 시저 호출 오버 헤드) 또는 컴파일러에 INLINEpragma를 사용하여 호출을 인라인하도록 지시 할 수 있습니다. 다음은 inlining in PL/SQL에 대해 자세히 설명하는 기사입니다.

+0

예를 들어 주셔서 감사합니다. 내가 뭘하려는 하나의 디버그 문을 인쇄하는 3 줄 쓰기를 피하는 것입니다. 귀하의 대답은 컴파일러가 디버그 모드가 아닌데 디버그 문을 제거 할 수 있도록하는 것 같습니다. 이것은 내가 찾고있는 것이 아닙니다. 디버그 모드에서 디버그 문을 인쇄하는 데 한 줄만 쓰는 방법을 찾고 있습니다. – plspl

+0

@plspl - 수정하십시오. 그것이 당신이 요구하는 것이 아닌 경우 잠재적으로 서브 프로그램 인라이닝을 찾고 있습니다. 그 대답을 펼쳤습니다. –

+0

감사합니다. 링크가 유용 할 것 같습니다. – plspl