问题描述
我们有一个从11g迁移Oracle 19C的业务案例,在迁移到工程环境后,我们的一个批处理作业失败,出现以下错误。
现有的查询在我们的业务逻辑是使用rowid的order by子句与ref游标关联,如果我们从排序中删除rowid查询工作,但相同的查询工作没有任何问题在11g。
我们在表中没有任何其他可靠的列进行排序,我们尝试没有rowid,结果输出不正确。
示例sql片段:
您可以在livesql中参考更多详细信息
非常感谢您的快速帮助。
ORA-02070: database does not support ROWIDs in this context
现有的查询在我们的业务逻辑是使用rowid的order by子句与ref游标关联,如果我们从排序中删除rowid查询工作,但相同的查询工作没有任何问题在11g。
我们在表中没有任何其他可靠的列进行排序,我们尝试没有rowid,结果输出不正确。
示例sql片段:
select * from table (test_pgk.transform_test (cursor ( select code,text from test_1 t order by code,rowid )))
您可以在livesql中参考更多详细信息
非常感谢您的快速帮助。
专家解答
我不确定您如何在11g中使用此功能。
剥离下来到11.2.0.4中的光标表达式给我:
关键错误是第一个错误:ORA-03001: unimplemented feature。似乎不支持rowid在光标表达式中的排序!如果您坚持这样做,则需要在支持下进行此操作才能添加。
一般来说,rowid的订购是不安全的。各种操作可以更改行的rowid,因此不能保证每次都以相同的顺序为您提供行。
We don't have any other reliable column in the table for the sorting
表上没有主/唯一键吗?
为了确保始终以相同的顺序获取行,将PK/UC列添加到排序的末尾将确保所有内容以相同的顺序返回。
如果您的表没有PK/UC... 无论如何,您可能还有更大的事情要担心。
剥离下来到11.2.0.4中的光标表达式给我:
create table test_1 (code number, text varchar2(100));
insert into test_1 values (1,'t1');
insert into test_1 values (2,'t2');
insert into test_1 values (3,'t3');
select * from v$version;
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
select
cursor (
select code,text
from test_1 t
order by code, rowid
)
from dual;
ORA-03001: unimplemented feature
ORA-02070: database does not support ROWIDs in this context关键错误是第一个错误:ORA-03001: unimplemented feature。似乎不支持rowid在光标表达式中的排序!如果您坚持这样做,则需要在支持下进行此操作才能添加。
一般来说,rowid的订购是不安全的。各种操作可以更改行的rowid,因此不能保证每次都以相同的顺序为您提供行。
We don't have any other reliable column in the table for the sorting
表上没有主/唯一键吗?
为了确保始终以相同的顺序获取行,将PK/UC列添加到排序的末尾将确保所有内容以相同的顺序返回。
如果您的表没有PK/UC... 无论如何,您可能还有更大的事情要担心。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




