【问题标题】:Oracle table expression on collection and orderOracle 表关于集合和订单的表达式
【发布时间】:2012-12-21 09:54:00
【问题描述】:

我正在分析一些现有的 PL\SQL 代码,我可以看到 Oracle 集合在使用表表达式的查询中未嵌套的情况。

没有 order 子句,代码显然假定项目将按存储在集合中的顺序返回。 我知道如果没有“order by”,您不能假设 select 返回的项目的顺序,但在这种情况下它似乎有效。

示例代码:

create type s_table as table of varchar2(100);

select rownum, t.* from table(s_table('TERM1', 'TERM2', 'TERM3')) t

我应该担心并更改代码吗?

【问题讨论】:

  • 我没有成功“取消排序”它们,即使是并行(t 8)。这种构造是纯 pl/sql 并且它按顺序迭代它,因此保持顺序。但我不保证这一点。

标签: oracle plsql


【解决方案1】:

No ORDER BY = 无订单保证

这里有一个例子证明了一个事实,集合中元素的顺序不一定是元素出现的顺序 在基于给定集合对象的其他查询中。

 SQL> CREATE TYPE str_nestab_ty AS TABLE OF VARCHAR2(20);
 2  /

 Type created.

 SQL> SELECT COLUMN_VALUE
 2  FROM TABLE(
 3                CAST
 4                (
 5                    MULTISET
 6                    (
 7                        SELECT 'e10' AS strval FROM DUAL UNION
 8                        SELECT 'e07' AS strval FROM DUAL UNION
 9                        SELECT 'e04' AS strval FROM DUAL UNION
10                        SELECT 'e20' AS strval FROM DUAL UNION
11                        SELECT 'e14' AS strval FROM DUAL
12                    )
13                    AS str_nestab_ty
14                )
15             );

   COLUMN_VALUE
--------------------
e04
e07
e10
e14
e20

SQL> 

【讨论】:

  • 是的,我同意,“无订单 = 无订单保证”问题是代码已经投入生产一段时间,在更简单的情况下它可以工作。但我看到它可能会停止工作,所以我将逐步更换它。谢谢你的例子。
  • 我不明白为什么这是一个有效的反例。这里的排序与嵌套表无关,只是UNION子句的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多