注册
达梦数据库-错误码-[-7184]-分析处理
专栏/技术分享/ 文章详情 /

达梦数据库-错误码-[-7184]-分析处理

PYZ 2025/07/18 178 0 0
摘要

错误码:-7184
错误内容:对象定义[%S]被修改,版本检查失败

原因:

SQL或PL/SQL中会先获取所有语句计划然后依次执行,当插入计划生成时对象字典版本号和真正执行时比较发生了变化会出现对象定义被修改。

示例:

--查看对象定义版本 select id,name,subtype$,version,crtdate from sysobjects where name = 'EMPNEW'; 行号 ID NAME SUBTYPE$ VERSION CRTDATE ---------- ----------- ------ -------- ----------- -------------------------- 1 1499 EMPNEW UTAB 0 2025-07-14 21:51:06.352000 已用时间: 0.452(毫秒). 执行号:3103. --执行此段代码出现报错 declare cnt number := 20; begin execute immediate 'truncate table empnew'; execute immediate 'alter table empnew disable constraint pk_id'; for i in 1..cnt loop insert into empnew(id,name,sal) select i,dbms_random.string('u',4),trunc(dbms_random.value(1000,5000),2) from dual; end loop; commit; execute immediate 'alter table empnew enable constraint pk_id'; end; / 执行失败(语句1) -7184: 对象定义[EMPNEW]被修改,版本检查失败 --再次查看对象定义版本,对象VERSION已被修改 select id,name,subtype$,version,crtdate from sysobjects where name = 'EMPNEW'; 行号 ID NAME SUBTYPE$ VERSION CRTDATE ---------- ----------- ------ -------- ----------- -------------------------- 1 1499 EMPNEW UTAB 2 2025-07-14 21:51:06.352000 已用时间: 4.367(毫秒). 执行号:3104.

问题处理:

方案1:修改为动态执行

[执行语句1]: declare cnt number := 20; begin execute immediate 'truncate table empnew'; execute immediate 'alter table empnew disable constraint pk_id'; for i in 1..cnt loop execute immediate 'insert into empnew(id,name,sal) select '||i||',dbms_random.string(''u'',4),trunc(dbms_random.value(1000,5000),2) from dual'; end loop; commit; execute immediate 'alter table empnew enable constraint pk_id'; end; 执行成功, 执行耗时62毫秒. 执行号:3339 影响了1条记录 1条语句执行成功

方案2:调整参数 PL_SQL_STRIP=1

参数说明:
指定是否开启语句块/过程/函数/包等脚本中的语句剥离功能,即将其中的 DML 语句改为动态执行。
0:不开启语句剥离功能
1:开启语句块中语句剥离功能
2:开启过程和函数中语句剥离功能
4:开启包和 CLASS 类中语句剥离功能
8:开启触发器中语句剥离功能
16:表示语句剥离后若不包含 USING 和 INTO,则动态执行直接使用原始 SQL 语句
32:表示语句剥离时,补充解析 MERGE INTO 中尚未解析的部分,保证语句中的变量能够成功转换为 USING 子句
64:允许 CURSOR 定义或 OPEN 游标指定的查询表达式进行 SQL 剥离。但禁止将静态游标赋值给动态游标;且 OPEN 动态游标时,必须指定 SQL,否则将报错
128:在 ELOG 日志中记录 SQL 剥离转换前后的语句,并将 PL_SQL_STRIP 调整成会话级参数
支持使用上述有效值的组合值,如 6 表示同时进行 2 和 4 的处理

示例:

--调整参数,动态系统级 sp_set_para_value(1,'PL_SQL_STRIP',1); [执行语句1]: declare cnt number := 20; begin execute immediate 'truncate table empnew'; execute immediate 'alter table empnew disable constraint pk_id'; for i in 1..cnt loop insert into empnew(id,name,sal) select i,dbms_random.string('u',4),trunc(dbms_random.value(1000,5000),2) from dual; end loop; commit; execute immediate 'alter table empnew enable constraint pk_id'; end; 执行成功, 执行耗时50毫秒. 执行号:3341 影响了1条记录 1条语句执行成功
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服