1

我一直在处理很多遗留的 plsql 代码。我在整个代码中都看到了如下调试语句。添加了“if”检查以避免调试模式关闭时过程调用的开销。

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

第二次编辑:

在下面添加了我的答案。

4

2 回答 2

3

根据您使用的 Oracle 版本,可以在 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

wherepackage_name.debug_mode是一个包级变量,指示代码是否应在调试模式下编译。

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

于 2013-02-26T21:56:05.670 回答
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');     

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

于 2013-02-27T19:12:46.973 回答