暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 过程输出参数与调试编译

ASKTOM 2020-09-17
344

问题描述

嗨,汤姆,

在你的网站上,我没有找到任何关于这个话题的东西可以帮助我,所以我决定写。
我们检测到程序执行中不会发生的情况。输出参数与值一起返回,当它不应该
当经过几次测试后,我们得出结论,程序包的编译方式影响了函数在输出参数中执行的行为时,情况变得更加奇怪。
也就是说,如果软件包是在调试模式下编译的,则结果符合预期。如果软件包未在debug中编译,则不会发生相同的情况。

场景: 当执行导致错误的函数时,预计不会填充输出参数 (除非代码写得不好)。但是很好的例子是代码没有指向正在填充的输出参数。
此外,如果我们操纵数据库中定义的优化级别,则输出参数上的行为也会受到影响。优化级别0和1 (对应于调试),一切正常。2级总是效果不佳,而3级则取决于代码的复杂性,有时效果很好,有时效果很差。

创建了简单的示例来突出显示检测到的异常。
附加的脚本创建两个函数和 “FCOUTPUT_TEST_LEVEL_1” 的调用/执行

应该注意的是,这种情况是在oracle 12c和oracle 19c (PDB) 中检测和测试的

事先,我感谢您能提供的帮助。

专家解答

这在文档中涵盖,尽管有一个通用的总体语句:

https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/plsql-subprograms.html#GUID-18E72176-145F-4E12-95F1-03F84B3D5DC6

"If the subprogram ends with an exception, then the value of the actual parameter is undefined."


如果例程以错误结尾,则您无法假设有关返回的参数值的 * 任何 *。

这与优化级别有关,因为我们可能会重新排列您的代码以提高其性能。因此,分配给out绑定变量的时间和发生时间可能已经转移了。

但最重要的是-如果该函数遇到错误,则不能 “使用” OUT参数的值。它的价值可以是任何东西。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论