查看: 8788|回复: 14

视图中使用rowid问题。能看不能当条件

[复制链接]
论坛徽章:
0
发表于 2005-7-6 17:29 | 显示全部楼层 |阅读模式
在如下实验步骤中,出现ORA-01410错不知是什么原因,请大家指教。
create table test1 (c1 varchar2(10));
insert into test1 values ('ttt');

create table test2 (c1 varchar2(10));
insert into test1 values ('ttt2');

create or replace view testv1  as
  select rowid myrowid ,c1 from test1
  union all
  select rowid myrowid,c1 from test2;

--然后执行以下查询语句:  
SQL> select * from testv1  ;

MYROWID            C1
------------------ ----------
AAAb1FAALAAAS19AAA ttt
AAAb1FAALAAAS19AAB ttt2

SQL> select * from testv1 where myrowid='AAAb1FAALAAAS19AAB';

select * from testv1 where myrowid='AAAb1FAALAAAS19AAB'

ORA-01410: 无效的 ROWID
招聘 : Ruby工程师
论坛徽章:
10
发表于 2005-7-6 18:15 | 显示全部楼层
ORA-01410 invalid ROWID
Cause: A ROWID was entered incorrectly. ROWIDs must be entered as formatted hexadecimal strings using only numbers and the characters A through F. A typical ROWID format is '000001F8.0001.0006'.

Action: Check the format, then enter the ROWID using the correct format. ROWID format: block ID, row in block, file ID.


***********************************************************************


desc  test v1

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2005-7-6 18:36 | 显示全部楼层
ROWID 格式和内容都能保证是正确的。
而且如果视图中只用到一个表也没有问题。如果用到两个表问题就出来了。


SQL> desc testv1
Name    Type         Nullable Default Comments
------- ------------ -------- ------- --------
MYROWID ROWID        Y                        
C1      VARCHAR2(10) Y

使用道具 举报

回复
论坛徽章:
0
发表于 2005-7-7 08:43 | 显示全部楼层

rowid是一个物理值

如果是多个表的关联视图,你让它取哪个表的ROWID呢?

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
发表于 2005-7-7 09:32 | 显示全部楼层

Re: rowid是一个物理值

最初由 afeng 发布
[B]如果是多个表的关联视图,你让它取哪个表的ROWID呢? [/B]


感觉应该不是这个问题

使用道具 举报

回复
招聘 : 系统分析师
论坛徽章:
483
马上有钱
日期:2014-02-19 11:55:14itpub13周年纪念徽章
日期:2014-09-29 01:14:14itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25马上有对象
日期:2014-10-12 11:58:40马上有车
日期:2014-11-16 17:11:29慢羊羊
日期:2015-02-09 17:04:38沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31ITPUB年度最佳版主
日期:2015-03-18 15:48:48
发表于 2005-7-7 09:45 | 显示全部楼层
测试:
create or replace view vv1 as...创建视图
create table tt as...--创建表
select c_dm,rowid id from a union select c_dm,rowid id from b

select * from vv1 where id='AAAIw4AAKAAAAB+AAA'
ORA-01410 invalid ROWID

select * from tt where id='AAAIw4AAKAAAAB+AAA'
C_DM  ID
aa        AAAIw4AAKAAAAB+AAA

表没问题,视图就出错

使用道具 举报

回复
招聘 : Ruby工程师
论坛徽章:
10
发表于 2005-7-7 13:36 | 显示全部楼层
try:
select * from testv1
where myrowid<='AAAb1FAALAAAS19AAB'
      and myrowid>=''AAAb1FAALAAAS19AAB'

使用道具 举报

回复
论坛徽章:
0
发表于 2005-7-7 18:48 | 显示全部楼层

可以了

为什么呢? 不能够精确等于?

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2005-7-14 19:48 | 显示全部楼层
哈哈哈哈,果然这样就可以了。
但问题是:从执行策略上看要执行全表扫描。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2005-7-14 19:58 | 显示全部楼层
后来试了一下,将以上语句:
select * from testv1
where myrowid<='AAAb1FAALAAAS19AAB'
and myrowid>=''AAAb1FAALAAAS19AAB'

改为
select * from testv1
where myrowid like 'AAAb1FAALAAAS19AAB'
也可以。
可是最大的问题是必须执行全表扫描,没办法 TABLE ACCESS BY USER ROWID

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年9月21日~23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表