问题描述
根据PLSQL_OPTIMIZE_LEVEL,我们在应用程序中遇到了错误消息消失的情况。
我在一个简单的脚本中隔离了这个问题。
运行此脚本,您将看到在第一次执行过程 “test_error_proc #” 时正常显示错误,但是在第二次执行时 (plsql_optimize_level = 2),错误消息消失。
我在一个简单的脚本中隔离了这个问题。
运行此脚本,您将看到在第一次执行过程 “test_error_proc #” 时正常显示错误,但是在第二次执行时 (plsql_optimize_level = 2),错误消息消失。
ALTER SESSION SET PLSQL_CODE_TYPE = INTERPRETED; ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 2; ALTER SESSION SET PLSQL_WARNINGS = 'DISABLE:ALL'; ALTER SESSION SET PLSCOPE_SETTINGS = 'IDENTIFIERS:NONE'; CREATE OR REPLACE PACKAGE test_error# AUTHID DEFINER IS TYPE record_rt IS RECORD( name user_source.name%TYPE, TYPE user_source.type%TYPE, line user_source.line%TYPE, text user_source.text%TYPE); TYPE table_ntt IS TABLE OF record_rt; FUNCTION get_source RETURN table_ntt PIPELINED; END test_error#; / CREATE OR REPLACE PACKAGE BODY test_error# IS FUNCTION get_source RETURN table_ntt PIPELINED IS r_row record_rt; BEGIN FOR r_loop IN (SELECT name, TYPE, line, text FROM user_source WHERE name = $$PLSQL_UNIT ORDER BY name, TYPE, line) LOOP r_row.name := r_loop.name; r_row.type := r_loop.type; r_row.line := r_loop.line; r_row.text := r_loop.text; PIPE ROW(r_row); END LOOP; raise_application_error(num => -20000, msg => 'This is an error !'); END get_source; END test_error#; / CREATE OR REPLACE PROCEDURE test_error_proc# AS BEGIN FOR idx IN (SELECT ROWNUM FROM TABLE(test_error#.get_source)) LOOP NULL; END LOOP; END test_error_proc#; / ALTER PROCEDURE test_error_proc# COMPILE plsql_optimize_level = 1; EXEC test_error_proc#; ALTER PROCEDURE test_error_proc# COMPILE plsql_optimize_level = 2; EXEC test_error_proc#; DROP PROCEDURE test_error_proc#; DROP PACKAGE test_error#;复制
专家解答
感谢一个不错的独立测试用例。
我不确定您所说的 “消失” 是什么意思-您是这个意思吗?
如果是这样,那么这似乎在12.2中得到解决
我不确定您所说的 “消失” 是什么意思-您是这个意思吗?
-- -- 11.2.0.4 / 12.1.0.2 -- SQL> ALTER PROCEDURE test_error_proc# COMPILE plsql_optimize_level = 1; Procedure altered. SQL> EXEC test_error_proc#; BEGIN test_error_proc#; END; * ERROR at line 1: ORA-20000: This is an error ! ORA-06512: at "MCDONAC.TEST_ERROR#", line 16 ORA-06512: at "MCDONAC.TEST_ERROR_PROC#", line 3 ORA-06512: at line 1 SQL> SQL> ALTER PROCEDURE test_error_proc# COMPILE plsql_optimize_level = 2; Procedure altered. SQL> EXEC test_error_proc#; BEGIN test_error_proc#; END; * ERROR at line 1: ORA-20000: ORA-06512: at "MCDONAC.TEST_ERROR_PROC#", line 3 ORA-06512: at line 1复制
如果是这样,那么这似乎在12.2中得到解决
SQL> ALTER PROCEDURE test_error_proc# COMPILE plsql_optimize_level = 1; Procedure altered. SQL> EXEC test_error_proc#; BEGIN test_error_proc#; END; * ERROR at line 1: ORA-20000: This is an error ! ORA-06512: at "MCDONAC.TEST_ERROR#", line 16 ORA-06512: at "MCDONAC.TEST_ERROR_PROC#", line 3 ORA-06512: at "MCDONAC.TEST_ERROR_PROC#", line 3 ORA-06512: at line 1 SQL> ALTER PROCEDURE test_error_proc# COMPILE plsql_optimize_level = 2; Procedure altered. SQL> EXEC test_error_proc#; BEGIN test_error_proc#; END; * ERROR at line 1: ORA-20000: This is an error ! ORA-06512: at "MCDONAC.TEST_ERROR#", line 16 ORA-06512: at "MCDONAC.TEST_ERROR_PROC#", line 3 ORA-06512: at "MCDONAC.TEST_ERROR_PROC#", line 3 ORA-06512: at line 1复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
597次阅读
2025-04-15 17:24:06
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
570次阅读
2025-04-18 14:18:38
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
488次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
474次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
458次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
434次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
433次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
419次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
363次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
358次阅读
2025-04-15 14:48:05