Model Oracle

kasiaKasia

MODEL ORACLE
Klauzula MODEL umożliwia tworzenie tablicy wielowymiarowej do której można zastosować formuły (reguły), wyznaczające nowe wartości, poprzez przetwarzanie komórek lub zestawów komórek. Tworzenie odbywa się poprzez mapowanie kolumn w zapytaniu na 3 grupy- kolumn :

  • Partitions (partycji), partycje dzielą zestaw wyników na bloki.
  • Dimensions (wymiarów) – określa, jakie kolumny w instrukcji SELECT są kolumnami wymiaru. Czyli do identyfikacji komórek w partycji. Domyślną kolumną w klauzuli MODEL jest unikatowy klucz. W razie zapotrzebowania dozwolone jest zdefiniowanie więcej niż jedną kolumnę wymiaru. W klauzuli Dimensions nie można używać aliansów SELECT, jedynie całość zdefiniowanego aliansu.
  • Measures (miar). Kolumny zdefiniowane w Measures mogą być przypisane nowe wartości w Rules w klauzuli modelu.

Składnia:

model [main]
  [ reference models ]
  [ partition by (<cols>)]
  dimension by (<cols>)
  measures (<cols>)
    [ ignore nav ] | [ keep nav ]
  [ rules
    [ upsert | update]
    [ automatic order | sequential order ]
    [ iterate (n) [ until <condition>]
  ]
  (<cell_assignment> = <expression> ...) 

Zobrazowanie mechanizmu modelu zostanie przedstawione w kilku przykładach, opartych o dialekt PL/SQL wykorzystując poniższą tabelę:

id name year capital country
1 TP S.A. 1991 240000 Warszawa
2 Kolporter S.A. 1992 20000 Kielce
3 Orange 1994 564000 Warszawa
4 Siemens 1986 190000 Berlin
5 Samsung 1938 20000 Suwon
6 Nokia 1965 18000 Espoo
7 Allianz 1890 18000 Berlin
8 RWE 1898 18000 Berlin

Przykład 1:

select 
    *   
from 
  company
model
RETURN ALL ROWS 
  dimension by (id)
  measures  (name, country, capital)
  rules (
  );


select 
    *   
from 
  company
model
  dimension by (id)
  measures  (name, country, capital)
  rules (
  );

id name country capital
1 TP S.A. Warszawa 240000
2 Kolporter S.A. Kielce 20000
3 Orange Warszawa 564000
4 Siemens Berlin 190000
6 Nokia Espoo 18000
7 Allianz Berlin 18000
8 RWE Berlin 18000
5 Samsung Suwon 20000
Powyższe polecenia zwracają te same wyniki. Dla pierwszego zapytania zawarto klauzurę RETURN ALL ROWS oznaczająca zwracanie wszystkich wierszy.

Przykład 2:

Wyświetlenie nowo powstałych rekordów można przedstawić następującymi poleceniami:

SELECT *
FROM company
MODEL  
 RETURN UPDATED ROWS 
       DIMENSION BY (id)
       MEASURES ( capital)
       RULES (
              capital[9] = 99,
              capital[10] = 9999
       );

id capital
10 9999
9 99
SELECT *
FROM company
MODEL  
       DIMENSION BY (id)
       MEASURES ( capital)
       RULES (
              capital[9] = 99,
              capital[10] = 9999
       );


SELECT *
FROM company
MODEL  
 RETURN ALL ROWS
       DIMENSION BY (id)
       MEASURES ( capital)
       RULES (
              capital[9] = 99,
              capital[10] = 9999
       );
id capital
10 240000
2 20000
3 564000
4 190000
6 18000
7 18000
8 18000
5 20000
10 9999
9 99
W pierwszym poleceniu klauzula RETURN UPDATED ROWS spowoduje wyświetlenie jedynie nowo utworzonych rekordów. Termin "capital[9] " zawarty w RULES nazywana się "symbolicznym odwołaniem do komórki" i odnosi się do wartości kolumny capital, gdzie „ID” ma wartość kolumny równą "9". Czyli określenie komórek, które są częścią formuły. Możesz używać warunków, takich jak <,>, IN, BETWEEN. Podczas dodania nowych kolumn w MEASURES spowoduje to wyświetlenie krotek (wierszy) tych atrybutów (kolumn).

Przykład 3:

SELECT country, name, year, capital
FROM company
MODEL
 RETURN UPDATED ROWS
       PARTITION BY (country) 
       DIMENSION BY (name, year)
       MEASURES (capital)
       RULES (
              capital['TP S.A.', 1991] = 10,
              capital['Siemens', 1986] = 20)
ORDER BY country, name, year;
country name year capital
Berlin Siemens 1986 20
Berlin TP S.A. 1991 10
Espoo Siemens 1986 20
Espoo TP S.A. 1991 10
Kielce Siemens 1986 20
Kilece TP S.A. 1991 10
Suwon Siemens 1986 20
Suwon TP S.A. 1991 10
Warszawa Siemens 1986 20
Warszawa TP S.A. 1991 10
Zapytanie zwraca wynik według reguł RULES podzielonych na partycje PARTITION BY (country) .

Przykład 4:

SELECT  country, name, year, capital
FROM company
WHERE country = 'Warszawa'
MODEL 
RETURN UPDATED ROWS
       PARTITION BY (country) 
       DIMENSION BY (name, year)
       MEASURES (capital)
       RULES (
              capital[name='TP S.A.', year > 1900] = 10)
ORDER BY country, name, year;
country name year capital
Warszawa TP S.A. 1991 10
W tym przykładzie formuła ma zastosowanie do każdej komórki, która ma nazwę równą „TP S.A.” i dla roku o wartości większej niż „1900”.

Przykład 5:

SELECT  country, name, year, capital
FROM company
MODEL RETURN UPDATED ROWS
       PARTITION BY (country) 
       DIMENSION BY (name, year)
       MEASURES (capital)
       RULES (
              capital['TP S.A.', 2011] = capital['Samsung', year = 1938] , 
              capital[name='TP S.A.', year > 1900] = capital['Orange', 1994], 
              capital['nowa firma', 2005] = capital['RWE', 1898] + capital['Allianz', 1890] 
       )
ORDER BY country, name, year;
country name year capital
Berlin nowa firma 2005 -
Berlin TP S.A. 2011 -
Espoo nowa firma 2005 -
Espoo TP S.A. 2011 -
Kielce nowa firma 2005 -
Kielce TP S.A. 2011 -
Suwon nowa firma 2005 -
Suwon TP S.A. 2011 -
Warszawa nowa firma 2005 -
Warszawa TP S.A. 1991 564000
Warszawa TP S.A. 2011 564000

Powyższy przykład zwraca dodatkowo nowe wartości. Wykonany przez regułę zawierającą większą wartość dla roku niż 1994, a także dla nazwy firmy. Pierwsza reguła aktualizuje istniejące dane. Druga wyświetla już zaktualizowane wartości nowych komórek. Ostania reguła ustawia nowe komórki.

Przykład 6:

SELECT  
 *
FROM 
 company
MODEL
  DIMENSION BY ( id)
  MEASURES (capital, name, year)
  RULES( 
    capital[any] = CV(id) 
  )
order by id;
id capital name year
1 1 TP S.A. 1991
2 2 Kolporter S.A. 1992
3 3 Orange 1994
4 4 Siemens 1986
5 5 Samsung 1938
6 6 Nokia 1965
7 7 Allianz 1890
8 8 RWE 1898
Funkcja CV jest używana wyłącznie podczas tworzenia klauzury model. Upraszcza zapis reguł. W powyższym przykładzie „CV(id)” zwraca bieżącą wartość „id” kolumny DIMENSION BY.
Możliwe jest również użycie CV() bez żadnych argumentów.

Przykład 7:

SELECT  
 *
FROM 
 company
MODEL
  DIMENSION BY (country , name )
  MEASURES (capital , year)
  RULES( 
    capital[any, any] = capital[ CV(), CV() ] 
  )
order by country, name;
country name capital year
Berlin RWE 18000 1898
Berlin Allianz 18000 1890
Berlin Siemens 190000 1986
Espoo Nokia 18000 1965
Kielce Kolporter S.A. 20000 1992
Suwon Samsung 20000 1938
Warszawa Orange 564000 1994
Warszawa TP S.A. 240000 1991
Funkcja CV() przekazuje wartości z DIMENSION BY (country, name ) od lewej do prawej dla klauzury RULES. Parametr „any” oznacza dla wszystkich wartości w DIMENSION BY .

Domyślnie Oracle wykonuje zasady w kolejności, w jakiej pojawiają się w klauzuli RULES. Są one określane jako SEQUENTIAL ORDER. Alternatywną zasadą jest AUTOMATIC ORDER. Różnica polega na tym, że jeśli komórki nie są zależne od siebie, zostanie podjęta akcja określona w RULES. Dla AUTOMATIC ORDER należy pamiętać, że do tej samej komórki można przypisać wartość tylko raz. Z kolei dla SEQUENTIAL ORDER przypisanie do tych samych komórek wartości nie spowoduje błędu.

Przykład 8:

SELECT  id,  name, year, sales
      FROM company
	MODEL 
                  RETURN UPDATED ROWS
		    PARTITION BY (id) 
		    DIMENSION BY (name, year)
		    MEASURES (capital sales)
		    RULES SEQUENTIAL ORDER (                             
                       sales['RWE', 1898 ] = sales['Orange', 1994] * 1.1,
                       sales['Orange', 1994] = sales['Nokia', 1965] 
		  )
ORDER BY id, name, year;
id name year sales
1 Orange 1994 -
1 RWE 1898 -
2 Orange 1994 -
2 RWE 1898 -
3 Orange 1994 -
3 RWE 1898 620400
4 Orange 1994 -
4 RWE 1898 -
5 Orange 1994 -
5 RWE 1898 -
6 Orange 1994 18000
6 RWE 1898 -
7 Orange 1994 -
7 RWE 1898 -
8 Orange 1994 -
8 RWE 1898 -

W momencie gdy zostanie zamieniona kolejność w RULES zostaną wyświetlone rekordy w innej kolejności.

 SELECT  id,  name, year, sales
	FROM company
		MODEL 
                  RETURN UPDATED ROWS
		    PARTITION BY (id) 
		    DIMENSION BY (name, year)
		    MEASURES (capital sales)
		    RULES SEQUENTIAL ORDER (                             
                      sales['Orange', 1994] = sales['Nokia', 1965] ,
                      sales['RWE', 1898 ] = sales['Orange', 1994] * 1.1
		    )
ORDER BY id, name, year;
id name year sales
1 Orange 1994 -
1 RWE 1898 -
2 Orange 1994 -
2 RWE 1898 -
3 Orange 1994 -
3 RWE 1898 -
4 Orange 1994 -
4 RWE 1898 -
5 Orange 1994 -
5 RWE 1898 -
6 Orange 1994 18000
6 RWE 1898 19800
7 Orange 1994 -
7 RWE 1898 -
8 Orange 1994 -
8 RWE 1898 -
Podczas użycia AUTOMATIC ORDER i zamiany kolejności wystąpienia reguł, zostanie wyświetlony identyczne rekordy.
SELECT  id,  name, year, sales
  FROM company
    MODEL 
    RETURN UPDATED ROWS
	PARTITION BY (id) 
	DIMENSION BY (name, year)
	MEASURES (capital sales)
	   RULES AUTOMATIC ORDER  (                      
             sales['Orange', 1994] = sales['Nokia', 1965] ,
             sales['RWE', 1898 ] = sales['Orange', 1994] * 1.1
	  )
ORDER BY id, name, year;
id name year sales
1 Orange 1994 -
1 RWE 1898 -
2 Orange 1994 -
2 RWE 1898 -
3 Orange 1994 -
3 RWE 1898 -
4 Orange 1994 -
4 RWE 1898 -
5 Orange 1994 -
5 RWE 1898 -
6 Orange 1994 18000
6 RWE 1898 19800
7 Orange 1994 -
7 RWE 1898 -
8 Orange 1994 -
8 RWE 1898 -

0 komentarzy