问题描述
嗨,团队,
我面临着以前从未参与过我的数据库的棘手问题。我们有一些表,其中包含很少的虚拟列。这些虚拟列是使用用户定义函数生成的,该函数只是将字符串添加到上方。它工作正常,但是从最近2周开始,它通过应用程序代码在此表中插入记录时出现错误。Insert语句仅传递物理列,因此insert语句没有问题。
一种观察结果是,它是在生成此表的扩展统计信息之后发生的。
所以我在另一个环境中尝试相同的场景,生成扩展的统计信息和插入。它工作正常,因此我删除了扩展的统计信息,然后再次尝试插入。同样,它工作正常。
我试图从Oracle支持中获取一些详细信息,但是它只有1-2个线程,这对我的情况没有帮助。
我正在提交我的错误和测试用例供您参考。
错误:
ORA-31495: “TEST” 上的同步变更表出错。“ISTEST”
ORA-54013: 在虚拟列上不允许插入操作
ORA-06512: 在第1行
我遵循的步骤如下
创建表TESTTABLE
(“ID” 号不为空启用,
“特征” 号不为空启用,
“值” VARCHAR2(2000 CHAR),
"UPPERVALUE" VARCHAR2(4000 CHAR) 始终生成为 ("TEST"."TESTPKG"."ISUPPERC"("特性","值")) 虚拟,
);
-- Package TESTPKG.ISUPPERC检查特性的valie,并对Value列执行上部字符串
-Maintable具有与TESTTABLE相同的结构
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID不在 (42,48,49,50) 中;
提交;
-- 检查Extended_Stats (通过创建表生成)
选择扩展名称,从DBA_STAT_EXTENSIONS扩展,其中TABLE_NAME = 'TESTTABLE';
-收集统计数据
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 测试,TABNAME => 'TESTTABLE',CASCADE => TRUE,estimate_procit => 1,METHOD_OPT => '对于所有列大小1',粒度 => '全部',度 => 16);
-插入
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID = 42;
提交;
-在另一列上生成extended_stats
从对偶中选择DBMS_STATS.CREATE_EXTENDED_STATS (NULL,'TESTTABLE','(UPPER(ID))');
-插入
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID = 48;
提交;
-在另一列上删除extended_stats
exec dbms_stats.drop_extended_stats('cramer','TESTTABLE','(UPPER(ID))'));
-插入
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID = 49;
提交;
-在上值上删除extended_stats
exec dbms_stats.drop_extended_stats('cramer','TESTTABLE','(TEST.TESTPKG.ISUPPERC (特性,值))');
-插入
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID = 50;
提交;
以上所有测试工作正常,但在原始环境中,仍然会ORA-31495: 同步更改表中的错误。
请指导。
谢谢
我面临着以前从未参与过我的数据库的棘手问题。我们有一些表,其中包含很少的虚拟列。这些虚拟列是使用用户定义函数生成的,该函数只是将字符串添加到上方。它工作正常,但是从最近2周开始,它通过应用程序代码在此表中插入记录时出现错误。Insert语句仅传递物理列,因此insert语句没有问题。
一种观察结果是,它是在生成此表的扩展统计信息之后发生的。
所以我在另一个环境中尝试相同的场景,生成扩展的统计信息和插入。它工作正常,因此我删除了扩展的统计信息,然后再次尝试插入。同样,它工作正常。
我试图从Oracle支持中获取一些详细信息,但是它只有1-2个线程,这对我的情况没有帮助。
我正在提交我的错误和测试用例供您参考。
错误:
ORA-31495: “TEST” 上的同步变更表出错。“ISTEST”
ORA-54013: 在虚拟列上不允许插入操作
ORA-06512: 在第1行
我遵循的步骤如下
创建表TESTTABLE
(“ID” 号不为空启用,
“特征” 号不为空启用,
“值” VARCHAR2(2000 CHAR),
"UPPERVALUE" VARCHAR2(4000 CHAR) 始终生成为 ("TEST"."TESTPKG"."ISUPPERC"("特性","值")) 虚拟,
);
-- Package TESTPKG.ISUPPERC检查特性的valie,并对Value列执行上部字符串
-Maintable具有与TESTTABLE相同的结构
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID不在 (42,48,49,50) 中;
提交;
-- 检查Extended_Stats (通过创建表生成)
选择扩展名称,从DBA_STAT_EXTENSIONS扩展,其中TABLE_NAME = 'TESTTABLE';
-收集统计数据
EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 测试,TABNAME => 'TESTTABLE',CASCADE => TRUE,estimate_procit => 1,METHOD_OPT => '对于所有列大小1',粒度 => '全部',度 => 16);
-插入
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID = 42;
提交;
-在另一列上生成extended_stats
从对偶中选择DBMS_STATS.CREATE_EXTENDED_STATS (NULL,'TESTTABLE','(UPPER(ID))');
-插入
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID = 48;
提交;
-在另一列上删除extended_stats
exec dbms_stats.drop_extended_stats('cramer','TESTTABLE','(UPPER(ID))'));
-插入
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID = 49;
提交;
-在上值上删除extended_stats
exec dbms_stats.drop_extended_stats('cramer','TESTTABLE','(TEST.TESTPKG.ISUPPERC (特性,值))');
-插入
插入TESTTABLE (ID、特征、值)
从可维护中选择ID、特征、值
其中ID = 50;
提交;
以上所有测试工作正常,但在原始环境中,仍然会ORA-31495: 同步更改表中的错误。
请指导。
谢谢
专家解答
是的,它可能没有记录得那么好:
“ORA-31495” 表示您已设置更改数据捕获 (CDC)。而从数据仓库指南来看,对CDC的限制之一是:
“此外,不支持虚拟列。”
扩展统计信息的实现方式是通过添加虚拟列 (尽管隐藏),例如,如果我跟踪扩展统计信息的创建:
也许更大的担忧是疾病预防控制中心正在被拒绝...所以你也许应该看看替代方案。
“ORA-31495” 表示您已设置更改数据捕获 (CDC)。而从数据仓库指南来看,对CDC的限制之一是:
“此外,不支持虚拟列。”
扩展统计信息的实现方式是通过添加虚拟列 (尽管隐藏),例如,如果我跟踪扩展统计信息的创建:
SQL> select
2 DBMS_STATS.CREATE_EXTENDED_STATS(
3 user, 'VEHICLE','(MAKE,MODEL)') tag
4 from dual;
TAG
----------------------------------
SYS_STU8QPK2S$PEWHARK2CP3#1F#G
--
-- in trace file
--
alter table "SH"."VEHICLE" add
(SYS_STU8QPK2S$PEWHARK2CP3#1F#G
as (SYS_OP_COMBINED_HASH(MAKE,MODEL))
virtual BY USER for statistics);
也许更大的担忧是疾病预防控制中心正在被拒绝...所以你也许应该看看替代方案。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




