Model語句是Oracle 10g的新功能之一。 本文通過一些簡單的例子幫助理解Model語句的用法,複雜使用場景請參考其他文章。
環境:當然需要Oracle 10g以上,本人是在11g上測試的。
1. 什麼是model語句
model語句是Oracle10g的新功能,可以在select語句裏面像其他編程語言操作數組一樣,對SQL的結果集進行處理。執行順序是位於Having之後。
select的解析執行順序1. from語句 2. where語句 (結合條件) 3. start with語句 4. connect by語句 5. where語句 6. group by語句 7. having語句 8. model語句 9. select語句 10. union、minus、intersect等集合演算演算11. order by語句
model的好處
Oracle 9i爲止,需要使用各種計算分析函數,union all等,以及藉助其他開發語言(C#及Java等)進行復雜計算統計合併等。使用Model之後,這些都可以在SQL裏面進行了。
model典型使用場景。
合計行追加 行列變換 使用當前行的前後行 RegExp_Replace函數的循環執行
2. HelloWorld
先看一個簡單的例子。
例句1select ArrValue,soeji from(select'abcdefghijklmn'as ArrValue, 1as soeji from dual) model dimension by(soeji) measures(ArrValue) rules(ArrValue[1]='Hello World');結果: ArrValue soeji
Hello World 1
說明:
model model語句的關鍵字,必須。dimension by dimension維度的意思,可以理解爲數組的索引,必須。measures 指定作爲數組的列
rules 對數組進行各種操作的描述。
例句1的理解:
select'abcdefghijklmn'as ArrValue,
1as soeji from dual;
上面子查詢的結果:ArrValue soeji
abcdefghijklmn 1
根據下面語句
model
dimension by(soeji)
measures(ArrValue)
soeji作爲索引對數組ArrValue進行操作,rules(ArrValue[1] = 'Hello World')就是說用Hello World覆蓋ArrValue[1]裏面的值。
在看一個例子,例句2:
select ArrValue,soeji
from(select'abcdefghijklmn'as ArrValue,
1as soeji from dual)
model
dimension by(soeji)
measures(ArrValue)
rules(ArrValue[1]='Hello World',
ArrValue[2]='Hello model');
執行結果:ArrValue soeji
Hello World 1
Hello model 2
rules的缺省行爲是存在就更新,不存在則追加,因此,ArrValue[1] = 'Hello World'是更新一條,ArrValue[2] = 'Hello Model'insert一條。
再看一個例子,例句3:
select ArrValue,soeji from(select'abcdefghijklmn'as ArrValue, 1as soeji from dual) model dimension by(soeji) measures(ArrValue) rules(ArrValue[3]='Hello Oracle');結果是:ArrValue soeji
abcdefghijklmn 1
Hello Oracle 3
model語句裏面,索引可以是不連續的。
再看一個例子,例句4:
select ArrValue,soeji from(select'abcdefghijklmn'as ArrValue, 1as soeji from dual) model return updated rows dimension by(soeji) measures(ArrValue) rules(ArrValue[4]='Hello CodeZine');結果是:ArrValue soeji
Hello CodeZine 4
使用model return updated rows的話,被rules更新或者插入的行才顯示,沒有更新過的行不再作爲SQL的結果。
再來一個,有下表,希望在檢索結果後面加一個合計行:addTotalID Val
1 30
2 100
3 50
4 300
select ID,Val from addTotal
model
dimension by(ID)
measures(Val)
rules(
Val[null]= Val[1]+Val[2]+Val[3]+Val[4]);
結果ID Val
1 30
2 100
3 50
4 300
null 480
不使用model的話可以使用rollup,union all等實現。
rollup方式:select ID,sum(Val)as Val from addTotal groupby rollup(ID);union all方式:select ID,Val from addTotal unionall selectnull,Sum(Val) from addTotal;
有用的保存一下。