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 | - |