在Oracle上使用ORDER INSERT

Stu*_*lis 2 sql oracle plsql

在Oracle 10g上,我们需要将视图中的记录插入到表中,以支持本身没有sort或ORDER选项的哑客户端应用程序.有没有办法控制INSERT语句将记录添加到目标表的顺序?

Vin*_*rat 11

无法可靠地控制Oracle以何种顺序检索没有的表的行ORDER BY.

此外,没有/*+APPEND*/提示,Oracle会将行物理存储在有空间的堆表中,这可能不在表的末尾!您可能认为Oracle按顺序插入它们,但任何DML或并发活动(2个以上的会话插入)都可能产生不同的物理组织.

您可以使用INDEX ORGANIZED表以PK的顺序存储行.此后,该表上的大多数简单查询将生成一组已排序的行.但是,如果您没有指定ORDER BY(根据查询和访问路径,行可以按任何顺序排列),这不能保证oracle将按该顺序选择行.

您也可以使用带有订单的视图,如果您无法触摸应用程序,这可能是您最好的选择(重命名表,使用表的名称创建视图,让应用程序认为它查询表).我不知道你的情况是否可行.

  • +1创建视图应该提供所需的结果,并且还避免重复数据.实际上OP提到他们已经在使用视图,所以也许只需添加一个ORDER BY即可. (2认同)
  • "你无法可靠地控制Oracle以什么顺序将行存储在堆表中"......我认为并非完全正确.直接路径插入将保留范围内的物理顺序,因此可用于改进数据段压缩.虽然有一些特殊的情况,当然选择顺序并不能保证. (2认同)

cag*_*boy 5

除非您指定ORDER BY,否则您永远无法保证Oracle将从SELECT返回行的顺序