⑴ora无效的rowid(说说Oracle的rowid
⑵说说Oracle的rowid
⑶在Oracle中rowid唯一标识每条记录所在的位置它作为一个伪列在查询中出现
⑷selectrowidid
⑸fromtest_table
⑹whererownum《=;
⑺ROWID?????????????????????ID
⑻AAAVcbAAPAAAAALAAA
⑼AAAVcbAAPAAAAALAAB
⑽AAAVcbAAPAAAAALAAC
⑾AAAVcbAAPAAAAALAAD
⑿AAAVcbAAPAAAAALAAE
⒀AAAVcbAAPAAAAALAAF
⒁AAAVcbAAPAAAAALAAG
⒂AAAVcbAAPAAAAALAAH
⒃AAAVcbAAPAAAAALAAI
⒄AAAVcbAAPAAAAALAAJ
⒅rowid是由个字符组成分个部分分别是
⒆个字符的对象编号个字符的文件号个字符的块编号个字符的行编号
⒇每一个字符的取值范围以及对应的数值是
⒈|A|?|???|a||???|||
⒉|B|?|???|b||???|||
⒊|C|?|???|c||???|||
⒋|D|?|???|d||???|||
⒌|E|?|???|e||???|||
⒍|F|?|???|f||???|||
⒎|G|?|???|g||???|||
⒏|H|?|???|h||???|||
⒐|I|?|???|i||???|||
⒑|J|?|???|j||???|||
⒒|K||???|k||???|+||
⒓|L||???|l||???|/||
⒔|M||???|m||???|?|??|
⒕|N||???|n||???|?|??|
⒖|O||???|o||???|?|??|
⒗|P||???|p||???|?|??|
⒘|Q||???|q||???|?|??|
⒙|R||???|r||???|?|??|
⒚|S||???|s||???|?|??|
⒛|T||???|t||???|?|??|
|U||???|u||???|?|??|
|V||???|v||???|?|??|
|W||???|w||???|?|??|
|X||???|x||???|?|??|
|Y||???|y||???|?|??|
|Z||???|z||???|?|??|
可以看到rowid是一个进制的表示方式利用上述对应表即可计算出
对象编号AAAVcb?=
行号AAA~AAJ=~
进制的转换完全可以交给机器去做Oracle也是这么认为的于是提供了一个叫做dbms_rowid的包它包含了一系列的方法我们借助这个包就可完成上述的工作了
selectrowid
substr(rowid)||:||dbms_rowidrowid_object(rowid)??????数据对象编号/object_id
substr(rowid)||:||dbms_rowidrowid_relative_fno(rowid)文件编号/file_id
substr(rowid)||:||dbms_rowidrowid_block_number(rowid)块编号/block_id
substr(rowid)||:||dbms_rowidROWID_ROW_NUMBER(rowid)??行编号/row_num
fromtest_table
whererownum《=;
ROWID?????????????数据对象编号/object_id???文件编号/file_id????块编号/block_id?????行编号/row_num
AAAVcbAAPAAAAALAAAAAAVcb:???????????AAP:????????????AAAAAL:?????????AAA:
AAAVcbAAPAAAAALAABAAAVcb:???????????AAP:????????????AAAAAL:?????????AAB:
AAAVcbAAPAAAAALAACAAAVcb:???????????AAP:????????????AAAAAL:?????????AAC:
AAAVcbAAPAAAAALAADAAAVcb:???????????AAP:????????????AAAAAL:?????????AAD:
AAAVcbAAPAAAAALAAEAAAVcb:???????????AAP:????????????AAAAAL:?????????AAE:
AAAVcbAAPAAAAALAAFAAAVcb:???????????AAP:????????????AAAAAL:?????????AAF:
AAAVcbAAPAAAAALAAGAAAVcb:???????????AAP:????????????AAAAAL:?????????AAG:
AAAVcbAAPAAAAALAAHAAAVcb:???????????AAP:????????????AAAAAL:?????????AAH:
AAAVcbAAPAAAAALAAIAAAVcb:???????????AAP:????????????AAAAAL:?????????AAI:
AAAVcbAAPAAAAALAAJAAAVcb:???????????AAP:????????????AAAAAL:?????????AAJ:
这个结果对不对呢?我们可以这样验证注意以下查询需要DBA权限
首先是object_id
ownerobject_nameobject_id
fromdba_objects
whereobject_name=TEST_TABLE;
OWNER?????OBJECT_NAME??????????OBJECT_ID
TEST??????TEST_TABLE
然后是文件编号和块编号
ownersegment_namesegment_typeextent_id
file_idblock_idblocksbytes
fromdba_extents
wheresegment_name=TEST_TABLE;
OWNER?SEGMENT_NAME?SEGMENT_TYPE??EXTENT_ID?FILE_ID?BLOCK_ID?BLOCKS?BYTES
TEST??TEST_TABLE???TABLE
TEST??TEST_TABLE???TABLE
编号为的块落在了编号为的exntent上只能说是验证了一半接下来我们将数据块dump出来看看不过做之前先为这一行打上标记看以下过程
test$logdwlogdwSQL》selectrowidt*fromtest_tabletwhererownum《=;
ROWID?????????????????????IDDATA
AAAVcbAAPAAAAALAAA??????????????????????????????????????Q
AAAVcbAAPAAAAALAAB??????????????????????????????????????Q
AAAVcbAAPAAAAALAAC??????????????????????????????????????Q
AAAVcbAAPAAAAALAAD??????????????????????????????????????Q
AAAVcbAAPAAAAALAAE??????????????????????????????????????Q
rowsselected
test$logdwlogdwSQL》updatetest_tablesetdata=lpad(killkill)whereid=;
rowupdated
test$logdwlogdwSQL》selectrowidt*fromtest_tabletwhererownum《=;
ROWID?????????????????????IDDATA
AAAVcbAAPAAAAALAAA???????????????????????????????killkill
AAAVcbAAPAAAAALAAB??????????????????????????????????????Q
AAAVcbAAPAAAAALAAC??????????????????????????????????????Q
AAAVcbAAPAAAAALAAD??????????????????????????????????????Q
AAAVcbAAPAAAAALAAE??????????????????????????????????????Q
rowsselected
test$logdwlogdwSQL》mit;
做好了标记可以dump数据块了
sys$logdwlogdwSQL》selectget_trace_name()fromdual;
GET_TRACE_NAME()
/u/app/oracle/diag/rdbms/logdw/logdw/trace/logdw_ora_trc
sys$logdwlogdwSQL》altersystemdumpdatafileblock;
Systemaltered
打开trc文件摘录如下
Startdumpdatablockstsn:file#:minblkmaxblk
DumpofmemoryfromxAFAtoxAFA
AFFCBCEC
block_row_dump:
tabrowxac
tl:fb:HFLlb:x?:
lishixinzhi/Article/program/Oracle//
Oracle数据库SELECT查询老是报ORA-怎么办求大神提点意见
ORA-invalidrows错误是与ORA-相似的Oracle数据库逻辑层面的讹误。了解ORA-逻辑坏块问题的成因,以及有效的解决手段十分重要。解决方案之一:可以通过如下PL/SQL过程将健康数据复制到新建表中,对于问题数据块中的数据将被跳过,对于能够容忍数据丢失的场景可以考虑这样恢复,之后truncate原表/分区并将健康数据加载进去。具体的脚本见下面的链接:【数据恢复】利用构造ROWID实现无备份情况下绕过ORA-、ORA-、ORA-等逻辑/物理坏块问题oerrora,,“invalidROWID”//*如果对ORA-做errorstack一般会看到下面的LOG:OBJDMISMATCHtyp=,seg.obj=%d,diskobj=%d,dsflg=%d,dsobj=%d,tid=%d,cls=%d触发ORA-错误的stackcall一般都是:kcbgtcr=》kcbzib=》kcbz_check_objd_typ,即在对数据块做逻辑读时运行到kcbz_check_objd_typ函数时,检测到OBJD不一致的问题。由于seg.obj和diskobj不一致,而g以后的kcbz_check_objd_typ函数负责验证块上的objd是否mistmatch,若不一致则触发ORA-错误。造成objdmimatch的主要可能有几种:、写丢失LostWrite,写丢失造成相关数据块没有为现有对象正常格式化,导致虽然该数据块的checksum是正确的,但对应数据字典却是不一致的。写丢失也可能由磁盘或卷组镜像同步软件的不完整复制造成。Iftheon-diskobjdis《kcbdsobj,thenthereispossibilityofOraclemessinguporIOlayer(OSCache,Volumemgretc)missingwrites.对于LostWrite在g版本中没有太好的预防方案,隐藏”_db_lost_write_checking”控制在DBWR写数据文件后立即去读被写的块以便检测出LostWrite,但是该参数对性能的损耗较大,不建议设置。g中引入了DB_LOST_WRITE_PROTECT参数配合DataGuard使用可以有效检测出LostWrite问题。如果自己搞不定可以找ASKMACLEAN专业数据库修复团队成员帮您恢复!
ORA-:无法使用distinct,groupby等子句从试图中选择rowid或采样
语句里主查询中用了*号,而*号包含了rowid,而主查询的数据源是子查询,主查询并不存在rowid,因此出现了ORA-错误。解决方法:在子查询中rowid取别名。例:selectrownum,rowidid,......
同样是invalidROWID,ora-与ora-有何区别
你使用了oracle的保留字size和rows,不能用来作为列名,把他改成别的吧,比如items_size,items_rows,不然以后调用也很麻烦。,
执行forupdate时ORA-:无效的ROWID
我曾经遇到的问题是:用两表联合查询,然后forupdate;结果肯定是生成新的虚拟表、虚拟rowid,所以无法更改。解决办法:只查一个表,用查询条件找到对应字段的值,然后进行更改。
oracleora-无效的rowid怎么解决
常见的rowid错误,是指sql引用到的物理地址错误,举个例子:sql查询过程中,表的索引被重建,这时sql查询时用到的索引字段物理地址已经发生了变化,再继续查询时,就会报出rowid错误.
以下程序为什么会报ORA-:STR绑定值的结尾Null字符缺失
楼上的果断是Oracle门外汉。Rownum只是一个逻辑字段。这个字段值的设定是这样的:Oracle将取出来的数据的第一条的rownum作为,依次累加。小于等于能查出数据就不难理解。而如果限制条件设成rownum=,那么他永远不满足条件,因为一条数据rownum=,不满足条件去掉,那么第二条的rownum又等于了。所以,rownum总是从开始的,没有和的话,就不可能出现.如果想用=作为限制条件,楼主可以用rowid。rowid可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。建议搜一下rownum和rowid的区别,好好理解下。
kettle报错无效的ROWID
kettle报错无效的ROWID,很可能是因为同时执行的转换都操作一个表引起的。其实下面也有其他信息:’转换被检测’、’转换正在杀死其他步骤!’。