plsql代码中的调试语句

时间:2013-02-26 21:50:59

标签: oracle debugging plsql

我一直在处理很多遗留的plsql代码。我在整个代码中都看到了类似下面的调试语句。添加了'if'检查以避免在调试模式为OFF时过程调用的开销。

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行。

第二次修改:

在下面添加了我的答案。

2 个答案:

答案 0 :(得分: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
$IF package_name.debug_mode = 1
$THEN
  Debug_pkg.logmsg(l_module_name,'Unexpected error : '|| SQLERRM, FND_LOG.LEVEL_WARNING);
$END

其中package_name.debug_mode是一个包级变量,指示代码是否应该以调试模式编译。

同样,根据您使用的Oracle版本,您可以将调试模式检入debug_pkg.logmsg并依赖编译器自动确定内联调用是否有益(消除过程调用开销)或指示编译器使用INLINE pragma内联调用。这篇文章更详细地讨论了inlining in PL/SQL

答案 1 :(得分:0)

感谢Justin Cave提供的链接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');     

然而,内联只是对编译器的请求,它可能会也可能不会内联。此外,内联过程需要在同一个包中定义。