一个和子查询,视图有关的ora-01722错误
子查询中的ora-01722;
语句:
select *
from
(select /*+full(b)*/
(substr(a034, 1, 4)) test
from sbjjcgc.datas
b
where reportid = 19
and a001 is not null) a
where substr(a.test, 1,
4) =
2007
出现ora-01722错误。但子查询a中的字段test中的数据全为类似于2007-08-23格式的字符。
a034
类型为
varchar2(500),表sbjjcgc.datas做过分析。但表sbjjcgc.datas中还存在a034字段数据为中文的数据行,rowid为AAFaw9AB/AAASmOAAH
数据行a034字段值为‘成都’。
此语句的执行计划如下:
SELECT
STATEMENT, GOAL = CHOOSE Cost=7380 Cardinality=31 Bytes=16027
TABLE ACCESS
FULL Object owner=SBJJCGC Object name=DATAS Cost=7380 Cardinality=31
Bytes=16027
使用的是全表扫描,由于使用到了full的提示,则CBO起作用。
若将以上语句改为:
select
*
from (select (substr(a034, 1, 4)) test
from sbjjcgc.datas b
where
reportid = 19
and a001 is not null) a
where substr(a.test, 1, 4) =
2007
执行计划为:
SELECT STATEMENT, GOAL = CHOOSE
TABLE ACCESS FULL
Object owner=SBJJCGC Object name=DATAS
此时RBO起作用,语句可成功执行。
改为:
select *
from (select
/*+index(b BBB)*/
(substr(a034, 1, 4)) test
from sbjjcgc.datas b
where
reportid = 19
and a001 is not null) a
where substr(a.test, 1, 4) =
2007
执行计划如下:
SELECT STATEMENT, GOAL = CHOOSE Cost=34
Cardinality=31 Bytes=16027
TABLE ACCESS BY INDEX ROWID Object owner=SBJJCGC
Object name=DATAS Cost=34 Cardinality=31 Bytes=16027
INDEX FULL SCAN Object
owner=SBJJCGC Object name=BBB Cost=26 Cardinality=62666
使用了索引和CBO
,索引bbb建在列SETID, REPORTID, REPORTVER, EID, DATAVER,
SNUMBER上。此时可成功运行,是由于索引字段将a034中有非数字字符
的数据行过滤掉了。
将子查询得到的结果放入一中间表中
create
table a_20070829 as select * from sbjjcgc.datas where reportid=19 and a001 is
not null
此时表a_20070829没做分析,没有建任何索引。
执行语句:
select
*
from (select substr(a034, 1, 4) test
from a_20070829
where reportid =
19
and a001 is not null) a
where a.test =
2013
时正常。
若将表a_20070829分析后,正常。
插入一条a03字段为非数字字符的数据行:
insert
into a_20070829 select * from sbjjcgc.datas where
rowid='AAFaw9AB/AAASmOAAH'
表a_2007089分析后,语句运行出错。
若将表分析删除,则正常。
原因:
语句 :
select *
from (select substr(a034,
1, 4) test
from a_20070829
where reportid = 19
and a001 is not null)
a
where a.test =
2013
中存在一个子查询,子查询中存在谓词--用于将a034字段中的非数字字符的数据行过滤掉。同时外部查询也存在谓词:
a.test =
2013,由于test是字符类型,则运行时ORACLE自动将此谓词转换为如下的形式:
to_number(a.test)=2013;
由于查询运行时自动将子查询并入外部查询,子查询的谓词和外部查询的谓词在同一层次的查询中,变为如下的形式:
select
substr(a034, 1, 4) test
from a_20070829
where reportid = 19
and a001 is
not null) a
and a.test = 2013
此时做全表扫描,若先使用谓词a.test =
2013,则对于a034中的非数字字符的数据行时,会产生错误。
若先使用其它的两个谓词的话,则可将a034中的非数字字符的数据行过滤。
使用索引时,索引可将这些数据行过滤。
若使用RBO时,则据规则先使用其它两个谓词
若使用CBO时,CBO据成本来决定首先使用哪个谓词。
solution:
1.增加索引;
2.增加提示
rule;
3.删除表分析。
4.使用提示no_merge---使用子查询单独先执行不并入外部查询,从而过滤掉非法的数据。
分享到:
相关推荐
ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法ora-00604 错误 解决 方法
Oracle数据库发生ORA-04031错误原因浅析及处理 Oracle数据库是甲骨文公司提供的一种分布式数据库管理系统,以分布式数据库为核心的软件产品。它具有完整的数据管理功能,作为一个关系数据库,它是一个非常实用的...
在使用Oracle Data Pump工具IMPDP(Import Data Pump)进行数据导入的过程中,可能会遇到ORA-39002和ORA-39070等错误。本文将针对这些错误的排查方法进行详细介绍,帮助用户理解问题的原因及解决策略。 ### 错误...
### Oracle 10g启动后报ORA-16038错误的解决方法 #### 错误概述 在启动Oracle 10g数据库时遇到ORA-16038错误,该错误通常与归档日志操作有关。具体错误信息为: ``` ORA-16038: log 1 sequence #230 cannot be ...
### ORA-01460 错误原因分析 #### 概述 在Oracle数据库操作过程中,可能会遇到ORA-01460错误,该错误全称为“ORA-01460: 转换请求无法实现或不合理”。这一错误通常发生在数据类型转换或者与操作系统之间的数据...
### 创建物化视图ORA-12014错误解决方法 #### 背景介绍 在Oracle数据库中,物化视图(Materialized View)是一种用于优化查询性能的重要工具。它预先计算并存储了复杂的查询结果,从而在实际查询时能够快速地返回...
### Oracle 错误 ORA-00132 和 ORA-00214 解析及处理 #### 一、错误概述 在Oracle数据库管理过程中,遇到ORA-00132和ORA-00214这类错误时,往往意味着数据库配置或启动过程中出现了问题。下面将对这两个错误进行...
### 如何处理错误ORA-29275:部分多字节字符 #### 问题背景与描述 在Oracle数据库操作过程中,用户可能会遇到一个特定的错误提示——ORA-29275:部分多字节字符。这一错误通常出现在执行查询`SELECT * FROM V$...
Oracle数据库不同版本间的客户端与服务端的连接问题通常涉及到安全和兼容性配置,这篇文章主要讲述了在Oracle 11g R2客户端尝试连接Oracle 19c服务端时,遇到了两个特定的错误:ORA-28040和ORA-01017,以及如何解决...
### Oracle ORA-03113 错误解析及解决方法 #### 一、ORA-03113 错误概述 ORA-03113 是一个较为常见的Oracle错误,通常出现在网络通信出现问题时,具体表现为“end-of-file on communication channel”(通信通道上...
在IT领域,尤其是在数据库管理与维护中,遇到ORA-01460错误是常见的问题之一,这通常意味着系统在尝试执行数据转换时遇到了未实现或不合理的请求。本文将深入探讨ORA-01460错误的成因、影响以及提供一系列有效的解决...
关于WIN10系统使用oracle instant client 时候提示ORA-01019错误的解决方案,本方案是配置好环境变量后依然提示ORA-01019错误的解决方案,内附本人制作测试的全过程说明
这些问题可能会导致数据库启动时出现ORA-01033错误(数据库无法完成启动过程),以及在尝试修复过程中可能遇到的ORA-01145错误(除非启用了介质恢复,否则不允许立即脱机)。本文将详细介绍这两种错误的原因、可能的...
在创建Oracle数据库连接时遇到的错误ORA-01017和ORA-02063涉及到用户认证问题以及Oracle数据库版本之间的差异处理。ORA-01017错误表示用户名或密码无效,登录被拒绝,而ORA-02063则通常表示在Oracle数据库之间进行...
ORA-00604: 递归SQL层1出现错误 ORA-03106: 致命的双工通信协议错误 ORA-02063: 紧接着line(源于dblink) 以及 ORA-04052: 在查找远程对象时出错 ORA-00604: 递归SQL层1出现错误 ORA-03120: 双工转换例行程序:整数...
在Oracle数据库管理与维护的过程中,遇到各种错误代码是家常便饭,其中“ORA-227101”错误虽然在题目中被误标,实际案例中展示的是“ORA-27101”错误,这是一个较为常见的问题,通常发生在数据库服务未能正确启动或...
ORA-12514 错误的原因和解决方法 ORA-12514 错误是 Oracle 数据库中常见的一种错误,它的出现可能是由于多种原因引起的。下面我们将从根本上探究 ORA-12514 错误的原因,并提供相应的解决方法。 原因 1:监听器没有...
### ERwin连接Oracle报ORA-01041内部错误,hostdef扩展名不存在的知识点解析 #### 一、问题背景及概述 在使用ERwin数据建模工具连接Oracle数据库时,可能会遇到ORA-01041内部错误提示:“hostdef扩展名不存在”。...
然而,在日常运维过程中,我们可能会遇到各种错误,比如“ORA-00702”就是其中之一。这个错误通常在尝试重启Oracle数据库服务时出现,意味着数据库实例在启动过程中遇到了问题。本文将详细介绍如何在Windows和Linux...