目录
一、环境信息
|------|--------------------------|
| 名称 | 值 |
| CPU | x86 |
| 操作系统 | KylinV10 |
| DM版本 | DM Database Server 64 V8 |
二、问题描述
-7184:对象定义XXX被修改,版本检查失败。
三、问题原因
达梦存过中的DML语句为静态执行时,会将存过中用到的表结构,执行计划等做一个快照,如果在执行过程中表定义发生变化,则提示此报错。
四、模拟实验
1、测试数据
sql
DROP TABLE IF EXISTS SUN;
CREATE TABLE SUN(A INT)
PARTITION BY LIST (A) (
PARTITION p_1 VALUES (1)
);
2、测试存过
sql
CREATE OR REPLACE PROCEDURE DM_TEST(VAL INT)
AS
v_sql VARCHAR(4000);
BEGIN
v_sql := 'ALTER TABLE SUN ADD PARTITION p_'||VAL||' VALUES ('||VAL||')';
execute immediate v_sql;
INSERT INTO SUN SELECT 1 FROM DUAL CONNECT BY LEVEL <= 100;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END;
/
存过实现:添加分区和枚举值。
3、复现问题
sql
16:25:19 SYSDBA@LOCALHOST:5236 SQL> CALL DM_TEST(2);
CALL DM_TEST(2);
[-7184]:对象定义[SUN]被修改,版本检查失败
-7184: DM_TEST line 13 .
已用时间: 15.992(毫秒). 执行号:0.
4、解决方法一之动态SQL
(1)静态SQL改动态
sql
CREATE OR REPLACE PROCEDURE DM_TEST_V1(VAL INT)
AS
v_sql VARCHAR(4000);
BEGIN
v_sql := 'ALTER TABLE SUN ADD PARTITION p_'||VAL||' VALUES ('||VAL||')';
execute immediate v_sql;
v_sql := 'INSERT INTO SUN SELECT 1 FROM DUAL CONNECT BY LEVEL <= 100';
execute immediate v_sql;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END;
为了后续实现效果,我新建了一个,将DML改成动态。
(2)执行效果
sql
16:28:54 SYSDBA@LOCALHOST:5236 SQL> CALL DM_TEST_V1(4);
DMSQL 过程已成功完成
已用时间: 20.767(毫秒). 执行号:771.
可以正常执行。此方法为通用方法,适用于新老版本。
5、解决方法二之调参
(1)查询参数
sql
16:29:05 SYSDBA@LOCALHOST:5236 SQL> SELECT * FROM V$DM_INI WHERE PARA_NAME = 'PL_SQL_STRIP';
PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE DEFAULT_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE SYNC_FLAG SYNC_LEVEL PARA_MODULE
------------ ---------- --------- --------- ------------- ------- ---------- ---------- ------------------------------------------------------------------------------------------------------------------------------------- --------- --------- ---------- -----------
PL_SQL_STRIP 0 0 255 0 N 0 0 Combination value for strip SQL from, 0:No, 1:PL, 2:PROC&FUNC, 4:PKG&OBJ, 8:TRIG, 16:ORG_SQL, 32:MERGE INTO, 64:CURSOR, 128:TRACE SQL SESSION ALL_SYNC CAN_SYNC database
已用时间: 11.040(毫秒). 执行号:772.
当前值为0,没有开启DML剥离共。
(2)参数介绍

(3)参数调整
sql
SP_SET_PARA_VALUE(1,'PL_SQL_STRIP',15);
(4)执行效果
sql
16:45:11 SYSDBA@LOCALHOST:5236 SQL> CALL DM_TEST(5);
DMSQL 过程已成功完成
已用时间: 28.759(毫秒). 执行号:774.
正常调用老存过。新版本才有的参数。