我一直在处理很多遗留的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行。
第二次修改:
在下面添加了我的答案。
答案 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');
然而,内联只是对编译器的请求,它可能会也可能不会内联。此外,内联过程需要在同一个包中定义。