错误码:-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]:
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条语句执行成功
参数说明:
指定是否开启语句块/过程/函数/包等脚本中的语句剥离功能,即将其中的 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条语句执行成功
文章
阅读量
获赞