注册
关于 ‘对象定义**被修改,版本检查失败’ 的问题处理
技术分享/ 文章详情 /

关于 ‘对象定义**被修改,版本检查失败’ 的问题处理

dm_forever 2024/04/12 2083 3 1

日前遇到一个问题在此分享一下。
问题描述:在一个存储过程中给一个表添加分区后(该客户将添加分区的动作封装到了一个存储过程中,输入需要添加分区的表名和分区名,如果存在此分区则不做操作,没有此分区则创建分区),再往这个表中做插入数据的操作,执行这个存储过程,会报‘对象定义**被修改,版本检查失败’的错误,检查表中的数据为空,但是分区却创建好了,重新执行此存储过程,则能正常执行,数据可以正常插入进去。
数据库版本:8.1.3.62
问题分析:达梦数据库中存储过程中的sql语句为静态执行,也就是在存储过程执行时,会将存储过程中用到的表结构,执行计划等做一个快照,如果此时表结构发生改变,则会抛出这个错误。
问题解决:
1、在存储过程中将sql语句改为动态执行,也就是用EXECUTE IMMEDIATE将需要执行的sql包起来,这是8.1.3.100版本之前的通用做法;
2、在8.1.3.100版本之后,可以通过修改参数PL_SQL_STRIP=15解决,这样不用修改存储过程就能正常执行,对于从其他数据库适配过来的系统比较友好,不至于改动量很大。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服