2012-12-21 23 views
3

我正在分析一些現有的PL \ SQL代碼,並且我可以看到使用表表達式查詢Oracle集合的情況。關於收集和訂單的Oracle表表達式

沒有訂單條款,代碼顯然假定這些商品將按照它們存儲在集合中的順序返回。 我知道如果沒有「order by」,你就不能承擔選擇返回的項目的順序,但在這種情況下它似乎工作。

示例代碼:

create type s_table as table of varchar2(100); 

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

我應該擔心和更改代碼?

+0

即使平行(t 8),我也不會成功「退出」它們。這個構造是純粹的pl/sql,並且它按順序迭代它,所以順序是保持的。但我不保證這一點。 –

回答

2

沒有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> 
+0

是的,我同意,「沒有訂單=沒有訂單保證」問題在於代碼已經投入生產一段時間,並且在更簡單的情況下它可以工作。但是我發現它可能會停止工作,所以我將逐步取代它。感謝你的例子。 – WaldiMen