Oracle的model用法簡介

 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;

 

 

 

有用的保存一下。

原文:http://www.yuloo.com/news/1101/546991.html

發佈了23 篇原創文章 · 獲贊 6 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章