ibm db2 –cechy warte odnotowania · ibm db2, l.banachowski ibm db2 ... „db@ udb v8.2 sql...
TRANSCRIPT
1/125IBM DB2, L.Banachowski
IBM DB2 – cechy warte odnotowaniav Różne typy tabel w tym MDC - wielowymiarowev Podział jednej bazy danych na niezależne partycje
– nie tylko pojedynczej tabeliv Łączenie pokrewnych instrukcji w jedną
– w celu zwiększenia wydajnościv Nadtabela i jej podtabele - oprócz typów i podtypówv Możliwość przekazywania z procedury zbiorów
wynikowych wierszy – poprzez otwarte kursory– również do aplikacji
v Autoryzacja przyznanym poziomem dostępu do tabel, kolumn i wierszy – Label Based Access Control (LBAC)
2/125IBM DB2, L.Banachowski
Bibliografia
Przygotowane w oparciu o:• materiały szkoleniowe używane przez Artura Wrońskiego (IBM) i E. Mrówkę-Matejewską;• Graeme Birchall, „DB@ UDB V8.2 SQL Cookbook” - dostępna w Internecie i w katalogu z prezentacją;• materiały edukacyjne firmy IBM: DB2 v9 Fundamentals, DB2 SQL Workshop, DB2 SQLWorkshop for Experienced Users, DB2 v9 Admin Workshop for Windows, DB2 v8 Stored ProceduresProgramming Workshop – dostępne w katalogu z prezentacją• Dokumentacja: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp• Raul F.Chong,.. „Zrozumieć DB2”, IBM Press, Mikom, PWN 2006.
3/125IBM DB2, L.Banachowski
DB2 Editions
Enterprise Server Edition w ith Data Partition ing Feature
M assive ly P ara llel P rocessor (M PP )
Enterprise Server E dition
W orkgroup S erver Edition
C lusterDB2
Express Edition
Express: wersja darmowa – wsparcie techniczne na Forum internetowym.
4/125IBM DB2, L.Banachowski
Instancja (database manager) - niezależne środowisko do pracy z bazami danych - dwie instancje na tym samym komputerze nie współużytkują żadnych zasobów (parametrów, plików). Serwer administracyjny udostępnia usługi zdalnej administracji i harmonogramowania zleceń (np. wykonanie skryptu SQL o określonej godzinie). Serwer administracyjny ma własną konfigurację i własną narzędziową bazę danych (tools database).
5/125IBM DB2, L.Banachowski
Control Center
ObjectTreePane
ContentsPane
ObjectDetailPane
6/125IBM DB2, L.Banachowski
Hierarchia obiektów DB2
Database 1
Instance 1
Log
DB configuration file
Index1
Index2BLOBs
Table1
Index1
Catalog
View1
View2
Table2 Table3
TSDMSREG2
SYSCATSPACE
TSDMSLRG3
dbm configuration file
Database 2Log
DB configuration file
Catalog
View1
Table1
SYSCATSPACE
USERSPACE1TSSMS1 TSDMSLRG1
Przy tworzeniu bazy danych domyślnie są tworzone trzy przestrzenie tabel: SYSCATSPACE, TEMPSPACE1, USERSPACE1
Instance=Database Manager
7/125IBM DB2, L.Banachowski
Struktura przestrzeni tabel
Kontener – miejsce, gdzie przechowywane są dane np. katalog, plik, dysk (raw device).
8/125IBM DB2, L.Banachowski
Przestrzeń tabel zarządzana przez system operacyjny (SMS)
CREATE TABLESPACE nazwaMANAGED BY SYSTEM USING ('path')
• Dodatkowe miejsce na dysku jest alokowane w miarę potrzeb –dane mogą być rozrzucone po całym dysku (większa fragmentacja).• Wymagają mniejszego zaangażowania DBA w zarządzanie.
9/125IBM DB2, L.Banachowski
Przestrzeń tabel zarządzana przez DBA (DMS)
CREATE TABLESPACE nazwa MANAGED BY DATABASE USING (FILE 'path' size) • Składa się z kontenerów, które mogą być:
• plikami o z góry ustalonym rozmiarze, założonych przez DBA w momencie tworzenia przestrzeni tabel,
• jest dla nich od razu alokowana przestrzeń na dysku, co oznacza, że zwykle znajdują się w spójnym obszarze na dysku. Oznacza to mniej operacji R/W.
• dyskami (RAW devices) - system ma do dyspozycji spójny obszar całego dysku.
• Aby powiększyć rozmiar przestrzeni tabel, administrator musi dołożyć kolejny kontener albo rozszerzyć istniejący.• Dane LOB mogą być składowane w osobnej przestrzeni tabel.
10/125IBM DB2, L.Banachowski
Typy przestrzeni tabel
v Regular - do przechowywania tabel, indeksów i tabel katalogu systemowego.
v Temporary - używane przez operacje, które wymagają dodatkowego miejsca na dysku: sortowanie, złączenia tabel, reorganizacja tabel.
v Long - do przechowywania danych typu LOB.
11/125IBM DB2, L.Banachowski
Strony danych i ekstenty
• Domyślnie strona danych w bazie DB2 ma wielkość 4 KB (można ustawić też wielkość 8, 16 i 32 KB podczas tworzenia bazydanych). • Każda strona (niezależnie od wielkości) zawiera nagłówek o stałej wielkości 76 bajtów. • Wiersz danych nie może być dzielony między różne strony danych. • Rozmiar ekstentu może mieć różną wielkość (ustawioną przez DBA podczas tworzenia przestrzeni tabel) - równy wielokrotności rozmiaru strony danych.• Dane typu Long Field (long varchar i long vargraphic) przechowywane są w segmentach po 32 KB a dane LOB w segmentach po 64 MB.
12/125IBM DB2, L.Banachowski
Wstawianie danych
• Miejsce na nowe dane jest alokowane we wszystkich kontenerach przestrzeni tabel wg algorytmu round-robin - dane w każdej przestrzeni tabel są równo rozłożone między kontenery. • W momencie dołożenia kontenera do przestrzeni tabel jest wykonywana reorganizacja danych tak, aby uzyskać równomiernie rozłożenie danych w kontenerach. • Kontenery powinny mieć jednakowy rozmiar,
• aby były równomiernie zapełniane i żeby miejsce w jednym z nich nie skończyło się szybciej niż w innych.
13/125IBM DB2, L.Banachowski
Przypisanie puli buforów danych do przestrzeni tabel
Domyślna pula buforów: ibmdefaultbp
ALTER BUFFERPOOL ibmdefaultbp IMMEDIATE SIZE 1000;CREATE BUFFERPOOL databp IMMEDIATE SIZE 10000 PAGESIZE 8K;ALTER TABLESPACE userspace1 BUFFERPOOL databp;
14/125IBM DB2, L.Banachowski
Struktura bazy danych
15/125IBM DB2, L.Banachowski
Partycja bazy danych
Partycja bazy danych (węzeł bazodanowy, database partition) - część bazy danych składającą się z własnych danych, indeksów, plików konfiguracyjnych i dzienników transakcji.
• Oprócz tego są partycje tabeli jak w Oracle i MS SQL Server.
16/125IBM DB2, L.Banachowski
Tabela – na poziomie fizycznym
Obiekt tabeli składa się z osobnych podobiektów: – Obiekt danych - zawierający zwykłe dane tabeli.– Obiekt indeksów – zawierający wszystkie indeksy założone na tabeli. – Obiekt dla pól typu LONG – zawierający zawartość wszystkich pól typu LONG.- Pierwszy obiekt dla pól typu LOB – zawierający wszystkie dane LOB.- Drugi obiekt dla pól typu LOB – zawierający metadane dla wszystkich danych LOB.
17/125IBM DB2, L.Banachowski
Bitmapy ekstentów
Bitmapy:1. alokowanych/wolnych ekstentów w pliku,2. opisujące ekstenty używane przez daną tabelę.
18/125IBM DB2, L.Banachowski
Typy tabel1. Regular – implementowane jako sterta (heap).
2. Append – typ regular zoptymalizowany dla operacji INSERT i wyszukiwania (z typu regular zmiana przez ALTER TABLE).
3. Multidimensional clustering (MDC) – grupowane według kilku kluczy (nazywanych wymiarami) – dla zastosowań OLAP.
4. Range-clustered (RCT) – grupowane liniowo względem wartości jednoznacznego klucza (wartość klucza określa adres) z określonego przedziału wartości, z góry alokowany obszar dla rekordów.• Możliwy obszar nadmiarowy dla kluczy spoza określonego przedziału.• Oprócz tego niezależnie są indeksy pogrupowane.
5. Partycjonowane
19/125IBM DB2, L.Banachowski
Składowanie tabeli MDC jako zbioru komórek z dostępem przez indeksy blokowe
Komórka (pojęcie logiczne) – zbiór rekordów z tym samym układem wartości wymiarów.
Indeks blokowy – osobno dla każdego wymiaru.Alternatywa dla indeksów bitmapowych.
20/125IBM DB2, L.Banachowski
Zbiór komórek - każda składająca się ze zbioru bloków
Komórka składa się z bloków stron rekordów (rozmiaru ekstentów) zapisywanych obok siebie na dysku.
21/125IBM DB2, L.Banachowski
Złożony indeks blokowy
Umożliwiający znajdowanie bloków dla kombinacji wartości wymiarów.
Uporządkowanie leksykograficzne
22/125IBM DB2, L.Banachowski
Tabela zorganizowana według wymiarów (MDC table)
CREATE TABLE Sales (sales_person VARCHAR(30) NOT NULL,region CHAR(5) NOT NULL,number_of_sales INT NOT NULL,year INT)ORGANIZE BY DIMENSIONS (sales_person, year);
23/125IBM DB2, L.Banachowski
SQL
24/125IBM DB2, L.Banachowski
SchematInstancja serwera składa się z baz danych. Każda baza danych składa się ze schematów, w tym jeden schemat tworzony automatycznie o nazwie identycznej z identyfikatorem autoryzacjiwłaściciela bazy danych. Jest to domyślny (bieżący) schemat w bazie danych.
CREATE SCHEMA MySchema;
Nazwa kwalifikowana obiektu w bazie danych: schemat.obiekt
CREATE TABLE Tab1 (kol int);
Tworzona w schemacie userid – czyli userid.Tab1
CREATE TABLE MySchema.Tab1 (kol int);
Tworzona w schemacie MySchema – czyli MySchema.Tab1
25/125IBM DB2, L.Banachowski
Usunięcie schematu
DROP SCHEMA nazwa RESTRICT;
Możliwe tylko wtedy, gdy schemat jest pusty – nie zawiera obiektów (słowo RESTRICT – wymagane).
26/125IBM DB2, L.Banachowski
Zmiana bieżącego schematu
VALUES CURRENT SCHEMA;SET CURRENT SCHEMA db2admin;CREATE TABLE tab1 (…); -- bieżący sch.CREATE TABLE schema1.tab1 (…); -- jawny schem.SET CURRENT SCHEMA USER;
27/125IBM DB2, L.Banachowski
VALUES …
Wynikiem tabela o wartościach określonych przez wartości wyrażeń. Przykłady:
VALUES (1, 2, 3) - 1 wiersz o 3 kolumnach
VALUES (1,21),(2,22),(3,23) - 3 wiersze każdy o 2 kolumnach
VALUES CURRENT DATE – 1 wiersz z jedną kolumną
28/125IBM DB2, L.Banachowski
29/125IBM DB2, L.Banachowski
CREATE TABLE EMPLOYEE(EMPNO CHARACTER(6) PRIMARY KEY,FIRSTNME VARCHAR(12) NOT NULL,MIDINIT CHARACTER(1),LASTNAME VARCHAR(15) NOT NULL,WORKDEPT CHARACTER(3),PHONENO CHARACTER(4),HIREDATE DATE,JOB CHARACTER(8),EDLEVEL SMALLINT NOT NULL,SEX CHARACTER(1),BIRTHDATE DATE,SALARY DECIMAL(9,2),BONUS DECIMAL(9,2),COMM DECIMAL(9,2)) IN USERSPACE1;
EMPLOYEE (lub STAFF)
30/125IBM DB2, L.Banachowski
DEPARTMENT (lub DEPT)
CREATE TABLE DEPARTMENT(DEPTNUMB SMALLINT NOT NULL,DEPTNAME VARCHAR(14),MANAGER SMALLINT,DIVISION VARCHAR(10),LOCATION VARCHAR(13))IN USERSPACE1;
31/125IBM DB2, L.Banachowski
Tabele
CREATE TABLE tab1 (id INT);
CREATE TABLE tab2 LIKE tab1;
CREATE TABLE tab3 AS (SELECT * FROM tab1) ;
DESCRIBE TABLE tab1;
32/125IBM DB2, L.Banachowski
Typy danych
SMALLINT, INT, BIGINTREAL, DOUBLE, DECIMAL(n,m)
CHAR(n), VARCHAR(n), LONG VARCHAR, CLOB(n)
GRAPHIC,VARGRAPHIC,LONG VARGRAPHIC, DBCLOB(n)
BLOB(n)
DATE, TIME, TIMESTAMP
DATALINK – obiekt zawierający link (URL) do zewnętrznego obiektu (atrybuty: link type, data location, comment)
XML
33/125IBM DB2, L.Banachowski
Konwersje typów
Operacje na niekompatybilnych typach danych wymagają jawnej konwersji, np:
CHAR <-> NUMERIC
–- Przykład jawnej konwersjiCAST(col1 as DECIMAL(4,2)) DECIMAL(col1,4,2)
–- Metoda na sprawdzenie typów zapytaniaDESCRIBE OUTPUT (SELECT SUM(col1) FROM tab2);
34/125IBM DB2, L.Banachowski
Kolumna IDENTITYCREATE TABLE invoice_data(invoice# INTEGER NOT NULLGENERATED ALWAYS AS IDENTITY,….PRIMARY KEY (invoice#));
GENERATED ALWAYS – zawsze generowany przez System (opcja domyślna),GENERATED BY DEFAULT – generowane przez System gdy użytkownik nie załączy wartości.Ostatnio wygenerowana wartość: IDENTITY_VAL_LOCAL()Generowane przed wyzwalaczem BEFORE. Możliwe parametry:AS IDENTITY (START WITH 100 INCREMENT BY 10)
35/125IBM DB2, L.Banachowski
Jedna operacja: Wstaw i wyświetlSELECT MIN(cust#) AS minc, WYNIKMAX(cust#) AS maxc, ==============COUNT(*) AS rows MINC MAXC ROWSFROM FINAL TABLE ----------------- ---- ----(INSERT INTO customers 3 5 3VALUES (DEFAULT,'FRED','xxx'),
(DEFAULT,'DAVE','yyy'),(DEFAULT,'JOHN','zzz'));
INSERT INTO customers(name, address) VALUES (‘FRED’, ‘xxx’); -- lub
INSERT INTO customersVALUES (DEFAULT, ‘FRED’, ‘xxx’);
Wstawianie do tabeli z IDENTITY
Połączenie dwóch instrukcji w jedną –zwiększenie wydajności.
36/125IBM DB2, L.Banachowski
SekwencjeCREATE SEQUENCE seq1 AS BIGINT
[START WITH 1INCREMENT BY 1NO MAXVALUENO CYCLECACHE 24];
CACHE – czy generować wartości sekwencji blokami
VALUES NEXTVAL FOR seq1 ;VALUES PREVVAL FOR seq1 ;VALUES PREVVAL FOR seq1 INTO :host-var;
ALTER SEQUENCE seq1 RESTART WITH 100;
37/125IBM DB2, L.Banachowski
Przykład
CREATE SEQUENCE fred; SEQ#--------
1WITH temp1 (n1) AS 2VALUES (‘a’),(‘b’),(‘c’),(‘d’),(‘e’) 3SELECT NEXTVAL FOR fred AS seq# 4FROM temp1; 5
38/125IBM DB2, L.Banachowski
Globalna stała za pomocą sekwencji
CREATE SEQUENCE biggest_sale_to_date AS INTEGER START WITH 345678INCREMENT BY 0;
Przechowywana w katalogu systemowym.
39/125IBM DB2, L.Banachowski
Tymczasowa globalna tabelaDECLARE GLOBAL TEMPORARY TABLE fred(dept SMALLINT NOT NULL, avg_salary DEC(7,2) NOT NULL, num_emps SMALLINT NOT NULL) ON COMMIT PRESERVE ROWS; -- lub ON COMMIT DELETE ROWS
-- DECLARE, bo jej schemat nie jest zapisywany w katalogu systemowym i istnieje tylko na czas sesji (domyślny kwalifikatorschematu tabeli session tj. session.fred). Objęte mechanizmem wycofywania ale nie odtwarzania po awarii!
INSERT INTO fredSELECT dept, AVG(salary), COUNT(*) FROM staffWHERE id > 200 GROUP BY dept;
SELECT COUNT(*) AS cnt FROM fred;DELETE FROM fred WHERE dept > 80;
40/125IBM DB2, L.Banachowski
Odróżnialny typ
Aby uniemożliwić wspólne operacje np. na dwóch różnych walutach.
CREATE DISTINCT TYPE Jap_Yen AS DECIMAL(15,2) WITH COMPARISONS;
Wartości typu JAP_YEN nie mogą być porównywane z wartościami typu DECIMAL(15,2)
41/125IBM DB2, L.Banachowski
IndeksyCREATE INDEX idx1 ON tab1(col1) ;
CREATE INDEX idx1 ON tab1(col1) CLUSTER ;-- indeks pogrupowany na tabeli tab1, może byćniejednoznaczny.
Gdy indeks na kluczu głównym ma być pogrupowany, to jest istotna kolejność:CREATE TABLE – bez definiowania klucza głównego,CREATE INDEX … CLUSTERALTER TABLE … PRIMARY KEY
42/125IBM DB2, L.Banachowski
Partycjonowana tabela1. Każda partycja tabeli w innej przestrzeni tabel
CREATE TABLE Customer (shipdate DATE, name CHAR(30)) IN ts1, ts2, ts3, ts4, ts5 PARTITION BY RANGE(shipdate)(STARTING FROM ('01/01/2009') ENDING AT ('12/31/2009') EVERY (3 MONTHS))
2. Każda partycja tabeli w innej partycji bazy danych
CREATE TABLE Sales (CUSTOMER VARCHAR(80), REGION CHAR(5), YEAR INTEGER) DISTRIBUTE BY HASH (YEAR) ORGANIZE BY DIMENSIONS (REGION, YEAR)
43/125IBM DB2, L.Banachowski
Perspektywy
CREATE VIEW employee_view ASSELECT a.empno, a.firstnme, a.salary, a.workdeptFROM employee aWHERE a.salary >=
(SELECT AVG(b.salary)FROM employee bWHERE a.workdept = b.workdept);
44/125IBM DB2, L.Banachowski
Perspektywy
CREATE TABLE p1(id INT CHECK (id < 100));CREATE TABLE p2(id INT CHECK (id >= 100));CREATE VIEW pv AS
SELECT id FROM p1 UNION ALLSELECT id FROM p2WITH CHECK OPTIONWITH ROW MOVEMENT;
WITH ROW MOVEMENT – przy aktualizacji wiersz naruszający warunek CHECK zmienia tabelę.
45/125IBM DB2, L.Banachowski
Perspektywy lokalne
WITH temp1(id,name) AS (VALUES (1,'abc'),
(2,'bcd'),(3,'cde'))
SELECT id+100, UCASE(name) FROM temp1ORDER BY name DESC;
WITH temp1(col1) AS ( -- rekurencyjnaVALUES 0UNION ALLSELECT col1 + 1FROM temp1 WHERE col1 + 1 < 100
) SELECT * FROM temp1;
46/125IBM DB2, L.Banachowski
WITH get_matching_rows AS -- perspektywa lokalna(SELECT id, name, salary -- podzapytanieFROM staffWHERE id < 50UNION ALL -- pełne zapytanieSELECT id, name, salary -- podzapytanieFROM staffWHERE id = 100)SELECT * -- podzapytanieFROM get_matching_rowsORDER BY id FETCH FIRST 10 ROWS ONLY FOR FETCH ONLY;
Terminologia SELECTów
47/125IBM DB2, L.Banachowski
Tabela zmaterializowanego zapytania -materialized query table
(perspektywa zmaterializowana)CREATE TABLE staff_summary AS(SELECT dept, COUNT(*) AS count_rows, SUM(id) AS sum_idFROM staffGROUP BY dept)
DATA INITIALLY DEFERRED REFRESH IMMEDIATE;
- Tabela utworzona z klauzulami określającymi źródło AS oraz parametry odświeżania REFRESH:
• IMMEDIATE – budowa przy użyciu instrukcji REFRESH TABLE, następnie przy każdej zmianie źródłowych tabel, lub • DEFERRED – tylko za pomocą instrukcji REFRESH TABLE.
- Fraza DATA INITIALLY DEFERRED wymagana.- Można tworzyć indeks (ale nie PRIMARY KEY ani UNIQUE). - Można tworzyć indeks pogrupowany (CLUSTER).
48/125IBM DB2, L.Banachowski
Instrukcja REFRESH TABLE
REFRESH TABLE staff_summary;
Dwa tryby odświeżania:
INCREMENTAL (przyrostowy) – w oparciu o dziennik zmian,
NOT INCREMENTAL – wyliczane od nowa całe zapytanie.
Dziennik zmian (staging table) – wymagany do odświeżania typu INCREMENTAL. Tworzony tak jak tabela, np:
CREATE TABLE emp_sumry_s(…) FOR staff_summary PROPAGATE IMMEDIATE;
49/125IBM DB2, L.Banachowski
Alias – tabeli, perspektywy
CREATE ALIAS employee_al1 FOR employee;
50/125IBM DB2, L.Banachowski
Nickname
Nazwa dla odległej tabeli lub nie-relacyjnego obiektu, przy użyciu którego w zapytaniach można ich używać tak jakby były zwykłymi tabelami.
CREATE NICKNAME emp FOR unixserver.production.employee;
51/125IBM DB2, L.Banachowski
Katalog systemowy w schemacie SYSCAT
SELECTCAST(colname AS CHAR(18)) AS Name,CAST(typename AS CHAR(18)) AS Type, length AS Length,scale AS Scale,nulls AS Nulls
FROM syscat.columns WHERE tabname = 'MASTER' AND tabschema = 'PL38219'
ORDER BY colno;
52/125IBM DB2, L.Banachowski
Więzy spójności
ALTER TABLE detail ADD CONSTRAINT detail_fk FOREIGN KEY (fk)
REFERENCES master(id) ON DELETE CASCADE;
ALTER TABLE tab1 ADD CONSTRAINT const1 CHECK (ABS(c1) > 100 OR c2 < 1000) ;
53/125IBM DB2, L.Banachowski
Wyszukiwanie danych
Jak w Standardzie:v Kolumny wyliczanev Select countv Select distinctv Klauzule WHERE, ORDER BYv Klauzula GROUP BY … HAVINGv Predykaty LIKE, BETWEEN, IN
54/125IBM DB2, L.Banachowski
Zmienne systemowe
CURRENT ISOLATIONCURRENT DATECURRENT LOCK TIMEOUTCURRENT PATHCURRENT SCHEMACURRENT TIMECURRENT TIMESTAMP USER
VALUES CURRENT DATE; -- lubSELECT CURRENT DATE FROM sysibm.sysdummy1;-- jak DUAL w Oracle
55/125IBM DB2, L.Banachowski
Operacje na czasie
CURRENT TIMESTAMP + 1 DAYCURRENT DATE – 3 MONTHSCURRENT TIME – 1 HOUR - 80 MINUTES + 2 SECONDS DATE('2004-10-30') + 1 MONTH
MONTHNAME(CURRENT DATE) DAYOFYEAR(CURRENT TIMESTAMP) TO_CHAR(CURRENT TIMESTAMP,'YYYY-MM-DD HH24:MI:SS')
CHAR(CURRENT DATE, ISO) CHAR(CURRENT DATE, EUR)
56/125IBM DB2, L.Banachowski
Operacje na ciągach znaków
'String1' CONCAT ' String2 'LENGTH(RTRIM('String1 ' )) LTRIM(' String1' )LCASE('String1' ) UCASE('String1' )SUBSTR('abcdef',2,3) REPLACE ( 'DINING', 'N', '--' )
SELECT SUBSTR(PROJNO,1, 2) AS PROJ_CLASS, PROJNAMEFROM PROJECTWHERE PROJNO LIKE 'IF%';
SELECT LASTNAME CONCAT ', ' CONCAT FIRSTNAMEFROM EMPLOYEEWHERE WORKDEPT = 'A00'ORDER BY NAME;
57/125IBM DB2, L.Banachowski
Podzapytania
SELECT CAST(t.nr AS INT), t.empno, t.lastname, (SELECT deptname FROM department
WHERE t.workdept = deptno) deptnameFROM (SELECT empno, lastname, workdept,
ROW_NUMBER() OVER() AS nr FROM employee) AS t
WHERE t.nr <= 10
58/125IBM DB2, L.Banachowski
Numerowanie rekordów(funkcje analityczne)
WITH temp AS (SELECT id, name, dept, years, salary, RANK() OVER(ORDER BY salary DESC) AS rowFROM staff
) SELECT * FROM temp WHERE row > 5 and row <= 10ORDER BY row;
Rank = 1+ liczba rekordów mniejszych od niego w danym porządku (mogą więc być przerwy w numeracji, jeśli dwa lub więcej rekordów ma ten sam rank w danym porządku).Rownumber, row_number = kolejny numer (bez przerw).
59/125IBM DB2, L.Banachowski
CASE
SELECT FIRSTNME, LASTNAME,CASE
WHEN salary < 40000 THEN 'Należy sie podwyżka'WHEN salary > 40000 and salary < 90000 THEN 'OK'ELSE 'Przeplacamy'
END AS commentFROM EMPLOYEE;
60/125IBM DB2, L.Banachowski
Złączenia
*) INNER JOIN … ON …*) LEFT OUTER JOIN … ON …*) RIGHT OUTER JOIN … ON …*) FULL OUTER JOIN … ON …
61/125IBM DB2, L.Banachowski
Klauzule FETCH FIRST i OPTIMIZE FOR
SELECT years, name, idFROM staffORDER BY years DESCFETCH FIRST 10 ROWS ONLY;
Zamiast FETCH FIRST n ROWS ONLY można użyćOPTIMIZE FOR n ROWS – wtedy zwracane są wszystkie wiersze, ze wskazówką dla optymalizatora, że przekazywanie wierszy do klienta będzie się odbywać blokami n wierszy.
Może być używana też bez ORDER BY.
62/125IBM DB2, L.Banachowski
Funkcja TABLE
SELECT a.id, a.dept, a.salary , b.deptsalFROM staff a, TABLE(SELECT b.dept, SUM(b.salary) AS deptsalFROM staff b WHERE b.dept = a.deptGROUP BY b.dept) AS bWHERE a.id < 40ORDER BY a.id;
Wymagana gdy podzapytanie odwołuje się do wierszy zewnętrznych tabel. • Ale można było zastosować tu operator INNER JOIN bez korzystania z TABLE.
63/125IBM DB2, L.Banachowski
Przykład z funkcją TABLE
SELECT id, salary AS sal, comm AS com, w, typFROM staff, TABLE(VALUES (salary,'SAL'), (comm, 'COM') ) AS tab(w, typ)WHERE id < 40ORDER BY id, typ;
64/125IBM DB2, L.Banachowski
INSERT
v Create table A(liczba int, napis varchar(10));v Insert into A values (1,'aaa');v Insert into A (liczba) values(2);v Insert into A values (3,'ccc'),(4,'ddd'),(5,'eee');v Select * from A;v Create table B(liczba int, napis varchar(10));v Insert into B (select * from A) ;
65/125IBM DB2, L.Banachowski
Wstawianie do dwóch tabel
CREATE TABLE Us_customer CREATE TABLE Intl_customer(Cust# INTEGER NOT NULL, (Cust# INTEGER NOT NULL,Cname CHAR(10) NOT NULL, Cname CHAR(10) NOT NULL,Country CHAR(3) NOT NULL, Country CHAR(3) NOT NULL,CHECK (Country = 'USA'), CHECK (Country <> 'USA'),PRIMARY KEY (Cust#)); PRIMARY KEY (Cust#));
INSERT INTO(SELECT * FROM Us_customerUNION ALL(SELECT * FROM Intl_customer)VALUES (111,'Fred','USA'), (222,'Dave','USA') ,(333,'Juan','MEX'));Połączenie dwóch instrukcji w jedną w celu zwiększenia wydajności.
66/125IBM DB2, L.Banachowski
Modyfikowanie danych - UPDATE
v Update B set liczba = liczba+10 where liczba<4;
v Update B set liczba = liczba+10, napis = 'cccc' where liczba = 12;
v Update A set (liczba,napis) =(select liczba, napis from B where liczba = 22) where liczba = 2;
67/125IBM DB2, L.Banachowski
Usuwanie danych - DELETE
v Delete from C where …
v Delete from (select rownumber() over(order by liczba) as rowid from A) where rowid>4;
68/125IBM DB2, L.Banachowski
Wyświetlanie modyfikowanych wierszyOLD TABLE, NEW TABLE, FINAL TABLE
v Select … from OLD TABLE (Delete from…v Select * from [NEW|FINAL] TABLE (Insert into A
values(10,'kkk'),(11,'mmm'),(12,'ooo'));v Select … from [NEW|FINAL] TABLE (Update….
– NEW – stan po wykonaniu instrukcji a przed wykonaniem wyzwalaczy AFTER i akcji referencyjnych
– FINAL – stan na sam koniec po wykonaniu wyzwalaczy AFTER i akcji referencyjnych
Połączenie dwóch instrukcji w jedną w celu zwiększenia wydajności.
69/125IBM DB2, L.Banachowski
MERGEWłóż wiersze tabeli u do tabeli g stosując UPDATE gdy wiersz z datą istnieje w g, wpp stosując INSERT.
MERGE INTO main gUSING (SELECT data,swieto FROM upd_main) uON (g.data = u.data) WHEN MATCHED THEN UPDATE SET swieto = u.swieto
WHEN NOT MATCHED THEN – tylko INSERT lub SIGNALINSERT (data,swieto)
VALUES (u.data, u.swieto)
[NOT] MATCHED [AND warunek_wyszukiwania]Połączenie INSERT, UPDATE, DELETE na jednej tabeli. Zwiększenie wydajności.
70/125IBM DB2, L.Banachowski
UNION, INTERSECT, EXCEPT
v UNION i UNION ALLv INTERSECT i INTERSECT ALLv EXCEPT i EXCEPT ALL
71/125IBM DB2, L.Banachowski
TRANSAKCJE
ALTER TABLE tabela ACTIVATE NOT LOGGED INITIALLY;
* Transakcje rozpoczynają się niejawnie.* Każda baza danych w DB2 jest transakcyjna.* Można wyłączyć tworzenie pozycji transakcji w dzienniku transakcji na poziomie tabeli na czas trwania transakcji (do jej końca).
72/125IBM DB2, L.Banachowski
Poziomy izolacji
* UR : brak blokad, chyba, że dany rekord jest zmieniany (UNCOMMITTED READ)* CS : blokada na wierszu tylko przy odczycie rekordu (COMMITTED READ)* RS : blokada do odczytu utrzymywana do końca transakcji (REPEATABLE READ)* RR : niezmienny wynik każdego zapytania w trakcie trwania transakcji (SERIALIZABLE)
Odejście od nazw w Standardzie.
73/125IBM DB2, L.Banachowski
Blokowane obiekty
74/125IBM DB2, L.Banachowski
Blokady na tabeli
IX Intention eXclusive
X eXclusive
Z superexclusive
IS Intention Share
IN Intent None
Obejmuje też blokady wierszy Tylko blokada tabeli
SIX Share with Intention eXclusive
S Share
U Update
Z – do wykonania ALTER i DROP na tabeli oraz CREATE i DROP na indeksie tabeli.
Dla transakcji realizowanej w trybie READ UNCOMMITTED
75/125IBM DB2, L.Banachowski
Blokady na wierszu
S
U
X
W
NS
NW
Blokada wiersza
blokady wierszy
S, U, X lub Z
Minimalna wspomagającablokada na tabeli
Aplikacja nie uzyskuje
jeśli założyła blokadę na tabeli:
IS
IX
IX
IX
IS
IX
Share
Update
eXclusive
Weak exclusive
Next key Share
Next key Weak exclusive
76/125IBM DB2, L.Banachowski
Dodatkowe rodzaje wierszowych blokad
v Weak Exclusive W – zakładana na wiersz wstawiany do tabeli (na tabeli IX) – słabsza niż X na tym wierszu.
v Next Key Weak Exclusive NW – gdy do indeksu jest dodawana nowa pozycja (na tabeli IX) – słabsza niż X na tym wierszu.
v Next Key Share NS – zakładana na wiersz podczas pełnego odczytu tabeli w trybie READ COMMITTED i REPEATABLE READ (na tabeli IS) –słabsza niż S na tym wierszu.
77/125IBM DB2, L.Banachowski
Kompatybilność trybów blokad
U
YES
NO
NO
NO
YES
NO
NS
YES
YES
NO
NO
YES
YES
W
NO
NO
NO
NO
NO
YES
BA
IN
IS
S
IX
SIX
U
X
Z
Tabelowe
BA
S
U
X
W
NS
NW
Wierszowe
IS
YES
YES
YES
YES
YES
YES
NO
NO
S
YES
YES
YES
NO
NO
YES
NO
NO
IX
YES
YES
NO
YES
NO
NO
NO
NO
IN
YES
YES
YES
YES
YES
YES
YES
NO
X
NO
NO
NO
NO
NO
NO
S
YES
YES
NO
NO
YES
NO
NW
NO
NO
NO
YES
YES
NO
SIX
YES
YES
NO
NO
NO
NO
NO
NO
U
YES
YES
YES
NO
NO
NO
NO
NO
X
YES
NO
NO
NO
NO
NO
NO
NO
Z
NO
NO
NO
NO
NO
NO
NO
NO
78/125IBM DB2, L.Banachowski
Blokady explicite-- Zapytanie tylko do odczytu
SELECT * FROM tab1 FOR READ ONLY;
-- Zapytanie może uaktualniać rekordy w trakcie przemieszczania się kursora po zbiorze wynikowym
SELECT * FROM tab1 FOR UPDATE;
-- Do instrukcji SELECT, SELECT INTO, DELETE, UPDATE można dołączyć poziom izolacji: WITH RR, WITH RS, WITH CS, WITH UR.
79/125IBM DB2, L.Banachowski
Konwersja blokady
v Gdy aplikacja posiadając już pewną blokadę na obiekcie, chce zamienić tę blokadę na silniejszą (np. U na X, IS na S, IX na X) – Silniejsza blokada może być przyznana lub nie.
v Przykład– Aplikacja wybiera wiersz w tabeli używając klauzuli FOR
UPDATE u Na wiersz jest zakładana blokada U (Update)
– Aplikacja dokonuje modyfikacji wiersza używając klauzuli WHERE CURRENT OFu Zachodzi konwersja blokady U na X
80/125IBM DB2, L.Banachowski
Parametry inicjalizacyjne bazy danych dotyczące blokad
Locklist – ilość miejsca pamięci do użycia przez blokady.
Maxlocks – maksymalny procent miejsca pamięci z Locklistprzeznaczony do użycia przez pojedynczą transakcję.
Gdy transakcja przekroczy Maxlocks, system zamienia blokady na wierszach na blokady na tabelach (eskalacja blokad).
81/125IBM DB2, L.Banachowski
Blokada tabeli
ALTER TABLE tabela LOCKSIZE TABLE; -- (blokowanie tabeli zamiast domyślnie wierszy)
Wskazane, gdy DML dotyczy większości wierszy dużej tabeli.
Z powrotem do blokowania wierszy (które jest domyślne):
ALTER TABLE tabela LOCKSIZE ROW;
LOCK TABLE tabela IN [SHARE|EXCLUSIVE] MODE
(blokada zwalniana na koniec transakcji)
82/125IBM DB2, L.Banachowski
Blokada bazy danych/przestrzeni tabel(explicite)
CONNECT TO database IN [EXCLUSIVE|SHARE] MODE
• Blokada bazy danych:CONNECT TO database IN EXCLUSIVE MODE
• Blokada przestrzeni tabel:QUIESCE table-spaces FOR TABLE table-nameINTENT FOR UPDATE;
83/125IBM DB2, L.Banachowski
Tworzenie typów obiektowych CREATE TYPE DEPT AS (DEPT NAME VARCHAR(20), MAX_EMPS INT) REF USING INT MODE DB2SQL -- MODE DB2SQL wymaganyCREATE TYPE EMP AS (NAME VARCHAR(32), SERIALNUM INT, DEPT REF(DEPT), SALARY DECIMAL(10,2)) MODE DB2SQL CREATE TYPE MGR UNDER EMP AS (BONUS DECIMAL(10,2)) MODE DB2SQLEwentualna specyfikacja metody po słowie kluczowym METHOD. Niezależnie, implementacja metody:CREATE METHOD BONUS (RATE DOUBLE) FOR EMPRETURN SELF..SALARY * RATE
84/125IBM DB2, L.Banachowski
Przykład tabeli z podtabelamiHierarchia typów obiektowych:Typy obiektowe: BusinessUnit_t, Person_tPodtypy: Student_t UNDER Person_t,
Employee_t UNDER Person_t, Manager_t UNDER Employee_t, Architect_t UNDER Employee_t
85/125IBM DB2, L.Banachowski
Tworzenie hierarchii tabel odpowiadającej hierarchii typów
CREATE TABLE BUnit OF BusinessUnit_t (REF IS Oid USER GENERATED);
CREATE TABLE Person OF Person_t (REF IS Oid USER GENERATED);
CREATE TABLE Employee OF Employee_t UNDER Person INHERIT SELECT PRIVILEGES -- wymagana klauzula dla podtabel(SerialNum WITH OPTIONS NOT NULL, Dept WITH OPTIONS SCOPE BUnit );
CREATE TABLE Student OF Student_t UNDER Person INHERIT SELECT PRIVILEGES;
CREATE TABLE Manager OF Manager_t UNDER EmployeeINHERIT SELECT PRIVILEGES;
CREATE TABLE Architect OF Architect_t UNDER EmployeeINHERIT SELECT PRIVILEGES;
86/125IBM DB2, L.Banachowski
Instrukcje SQL na nadtabeli i jej podtabelach
Instrukcje SELECT, UPDATE, DELETE operujące na nadtabeli, domyślnie działają również na wszystkich wierszach jej podtabel. Np. UPDATE na tabeli Employee dotyczy wierszy tabel Employee, Manager i Architect, ale UPDATE na tabeli Manager dotyczy tylko wierszy tabeli Manager.
Aby ograniczyć działanie instrukcji wyłącznie do danej tabeli należy użyć opcji ONLY (np. ONLY Employee).
87/125IBM DB2, L.Banachowski
Jak zaszyfrować kluczowe dane?
SET ENCRYPTION PASSWORD = 'Ben123';INSERT INTO EMP(SSN) VALUES ENCRYPT ('289-46-8832');
INSERT INTO EMP(SSN) VALUES ENCRYPT ('289-46-8832', 'Ben123');
SELECT DECRYPT_CHAR (SSN,'Ben123') FROM EMP;
88/125IBM DB2, L.Banachowski
LBAC (Label Based Access Control)SALARYIDLBACNo
LBAC
450001057800020083000904600025333000755400010082000102560002503000060450005070000505000010060000255
SELECT * FROM EMPWHERE SALARY >= 50000
& Poziom dostępu użytkownika = 100
Użytkownicy na poziomie 100 mają dostęp do wierszy: ID <= 100 i salary >= 50000 (na zielono)
Gdy opcja LBAC nie jest włączona, użytkownicy za pomocąpowyższego zapytania mają dostęp do wierszy: salary >= 50000 (na czerwono)
Ułatwienie zarządzania uprawnieniami dostępu użytkowników do danych
Poziom dostępu definiowany dla tabel i wierszy tabel.
89/125IBM DB2, L.Banachowski
Język procedur składowanych
SQL Procedural Language
(SQL PL)
90/125IBM DB2, L.Banachowski
Przypisanie wartości zmiennym
Instrukcje w kodzie:
SET zmienna = wyrażenie
VALUES wyrażenie, … INTO zmienna, …
91/125IBM DB2, L.Banachowski
BEGINDECLARE v_var1 CHAR(20);DECLARE v_var2 INTEGER;DECLARE v_var3 TIMESTAMP;DECLARE v_var4 SMALLINT DEFAULT 99;
SELECT name INTO v_var1 FROM staffFETCH FIRST 1 ROW ONLY;
SET v_var2 = 100;VALUES CURRENT TIMESTAMP INTO v_var3;VALUES (p_par1,99) INTO v_var4,v_var2;
END
Instrukcja złożona (blok), zmienne
92/125IBM DB2, L.Banachowski
BEGIN ATOMIC… -- SQL’e traktowane są jak jedno polecenie
END-- nieobsłużony błąd -> zatrzymanie wykonywania ->-- wszystkie zmiany zostają wycofane
BEGIN ATOMIC nie może być zagnieżdżony w BEGIN ATOMIC---------------------------------------------BEGIN NOT ATOMIC -- to jest domyślna opcja…
END-- nieobsłużony błąd -> zatrzymanie wykonywania ->-- Zmiany pozostają. Konieczne ręczne wycofanie.
ATOMIC, NOT ATOMIC
93/125IBM DB2, L.Banachowski
lab1: BEGIN DECLARE v_id INT;
lab2: BEGIN DECLARE v_id INT;SET lab1.v_id = 1;SET lab2.v_id = 10;SET v_id = 100;
END lab2;
END lab1
Etykiety instrukcji złożonej
94/125IBM DB2, L.Banachowski
IF v_var = 1 THENUPDATE …
ELSEINSERT …
END IF;---------------------------------------------CASEWHEN v_var > 0 THEN …WHEN v_var > 10 THEN …ELSE …
END CASE;
Instrukcje warunkowe
95/125IBM DB2, L.Banachowski
WHILE (var1 = 1) DO…END WHILE;---------------------------------------------REPEAT…UNTIL (var1 < 100) END REPEAT;---------------------------------------------label:LOOP… LEAVE label;… ITERATE label;END LOOP;---------------------------------------------GOTO label;
Iteracje
96/125IBM DB2, L.Banachowski
Instrukcja złożona i WHILE
BEGIN ATOMICDECLARE cnt INT DEFAULT 0;
WHILE (cnt < 1000) DOINSERT INTO Tab1 VALUES (cnt, ceiling(rand()*1000) );SET cnt=cnt+1;
END WHILE;END
Średniki oddzielają składowe instrukcje w instrukcji złożonej. Średnik nie może kończyć zewnętrznej instrukcji złożonej ani też końca instrukcji CREATE PROCEDURE.
W skryptach można określić terminator przy użyciu -- #SET DELIMITER
97/125IBM DB2, L.Banachowski
FOR loop_name AS SELECT col1,… FROM …DOSET var1 = loop_name.col1;…
END FOR;
Instrukcja FOR
98/125IBM DB2, L.Banachowski
Przykład
BEGIN ATOMICDECLARE cntr SMALLINT DEFAULT 1;FOR V ASSELECT id AS idval FROM staffWHERE id < 80 ORDER BY id
DOUPDATE staff SET comm = cntr WHERE id = V.idval;SET cntr = cntr + 1;
END FOR;END
99/125IBM DB2, L.Banachowski
BEGIN ATOMICDECLARE v_var2 INTEGER;CREATE TABLE mytab(id INT);CREATE INDEX mytab_idx ON mytab(id);BEGINDECLARE v_var4 INTEGER DEFAULT 100;INSERT INTO mytab(id) VALUES (99),(v_var4);GET DIAGNOSTICS v_var2 = ROW_COUNT;SET p_result = 'L.wierszy: '||char(v_var2);END;END
GET DIAGNOSTICS wymagane, aby uzyskać ROW_COUNT!
Instrukcja złożona
100/125IBM DB2, L.Banachowski
ITERATE, LEAVEBEGIN ATOMICDECLARE cntr INT DEFAULT 0;whileloop:WHILE cntr < 60 DO
SET cntr = cntr + 10;UPDATE staff SET salary = cntr WHERE id = cntr;IF RAND() < 0.5 THEN LEAVE whileloop;ELSEIF RAND() < 0.2 THEN ITERATE whileloop; ELSE UPDATE staff SET comm = cntr + 1
WHERE id = cntr;END IF;
END WHILE;END
101/125IBM DB2, L.Banachowski
SIGNAL
Powtarzanie iteracji losową liczbę razy, po czym wygenerowanie komunikatu o wyjątku (jak RAISERROR w SQLServer).
BEGIN ATOMICDECLARE cntr INT DEFAULT 1;DECLARE emsg CHAR(20);whileloop:WHILE RAND() < .99 DO
SET cntr = cntr + 1;END WHILE;SET emsg = '#loops: ' || CHAR(cntr);SIGNAL SQLSTATE '75001' SET MESSAGE_TEXT = emsg;
END
102/125IBM DB2, L.Banachowski
CREATE PROCEDURE proc01 () BEGINEND
call proc01()
Najprostsza procedura
103/125IBM DB2, L.Banachowski
Przykład
CREATE PROCEDURE foo ( IN v_workdept CHAR(3))LANGUAGE SQLP1: BEGIN
CASE v_workdeptWHEN 'A00'THEN UPDATE department
SET deptname = 'DATA ACCESS 1';WHEN 'B01'THEN UPDATE department
SET deptname = 'DATA ACCESS 2';ELSE UPDATE department
SET deptname = 'DATA ACCESS 3';END CASE;
END P1
104/125IBM DB2, L.Banachowski
CREATE PROCEDURE p01 (IN p_par1 INTEGER,INOUT p_par2 DECIMAL(8,2),OUT p_par3 CHAR(20)
) SPECIFIC proc1BEGIN-- ciało procedury
END
call p01(99,x,y)
Parametry procedur
SPECIFIC – dodatkowa nazwa procedury. Może być użyta przy komentowaniu i usuwaniu procedury. Gdy nie podana, generowana przez system.
105/125IBM DB2, L.Banachowski
PrzykładCREATE PROCEDURE sales_status
(IN quota INTEGER, OUT sql_state CHAR(5))DYNAMIC RESULT SETS 1LANGUAGE SQL
BEGINDECLARE SQLSTATE CHAR(5);DECLARE rs CURSOR WITH RETURN FORSELECT sales_person, SUM(sales) AS total_sales
FROM salesGROUP BY sales_personHAVING SUM(sales) > quota;
OPEN rs;SET sql_state = SQLSTATE;
END Po wykonaniu procedury dostępny jest zbiór wynikowy poprzez otwarty kursor. Ukrycie w procedurze instrukcji SELECT zwracających zbiory wierszy.
106/125IBM DB2, L.Banachowski
Funkcja skalarnaCREATE FUNCTION get_sal(inval SMALLINT)RETURNS DECIMAL(7,2)RETURN SELECT salary FROM staff WHERE id = inval
SELECT id AS id, get_sal(id) AS salaryFROM staffWHERE id < 40 ORDER BY id;
Wynik:Instrukcje DML nie są dozwolone.
ID SALARY-- -------------10 98357.5020 78171.25 30 77506.75
107/125IBM DB2, L.Banachowski
Funkcja tabelowaCREATE FUNCTION get_staff()RETURNS TABLE (ID SMALLINT, name VARCHAR(9), YR SMALLINT) RETURN SELECT id, name, years FROM staff
SELECT * FROM TABLE(get_staff()) AS s WHERE s.id < 40 ORDER BY s.id;
ID NAME YR-- -------- -------10 Sanders 720 Pernal 830 Marenghi 5
108/125IBM DB2, L.Banachowski
Przykład
CREATE FUNCTION NumList(max_num INTEGER)RETURNS TABLE(num INTEGER)RETURN
WITH temp1 (num) AS(VALUES (0)
UNION ALLSELECT num + 1FROM temp1WHERE num < max_num)SELECT numFROM temp1
109/125IBM DB2, L.Banachowski
Przykład
CREATE FUNCTION dpt2 ()RETURNS TABLE (dept SMALLINT, #names SMALLINT)BEGIN ATOMICRETURN
SELECT dept, count(*) FROM staffGROUP BY dept ORDER BY dept;
END
SELECT * FROM TABLE(dpt2()) T ORDER BY T.dept;
110/125IBM DB2, L.Banachowski
DECLARE SQLSTATE CHAR(5);DECLARE cursor1 CURSOR FOR SELECT … ;
OPEN cursor1;
FETCH FROM cursor1 INTO var1, var2, … ;WHILE (SQLSTATE = ’00000’)DO…
END WHILE;CLOSE cursor1;
Kursory
111/125IBM DB2, L.Banachowski
DECLARE SQLSTATE CHAR(5);DECLARE cursor1 CURSOR FOR SELECT … FOR UPDATE;
-- domyślnie: FOR READ ONLYOPEN cursor1;
FETCH FROM cursor1 INTO var1, var2, … ;WHILE (SQLSTATE = ’00000’)DO …DELETE FROM tab1 WHERE CURRENT OF cursor1;…UPDATE tab1 SET … WHERE CURRENT OF cursor1;…
END WHILE;
Kursory – FOR UPDATE
112/125IBM DB2, L.Banachowski
DECLARE cursor1 CURSOR WITH HOLD FOR SELECT … FOR UPDATE;
……COMMIT;-- teraz kursor cursor1 nie zostanie zamkniętylubROLLBACK;-- wszystkie kursory są zamykane-- wszystkie blokady są zwalniane-- lokatory BLOB-ów są zwalniane
Kursory – WITH HOLD
113/125IBM DB2, L.Banachowski
CREATE PROCEDURE proc01 ()DYNAMIC RESULT SETS 1
BEGINDECLARE cursor1 CURSOR WITH RETURN FOR SELECT …;
OPEN cursor1;-- by przekazać zbiór wynikowy dalej-- kursor nie może być zamknięty
END
Kursory – WITH RETURN
114/125IBM DB2, L.Banachowski
DECLARE SQLSTATE CHAR(5) DETAULT ’00000’;-- ISO/ANSI SQL92-- ’00xxx’ <- success-- ’01xxx’ <- warning-- ’02xxx’ <- not found-- other <- error
DECLARE SQLCODE INT DETAULT 0;-- tylko DB2 -- 0 <- success-- >0 <- warning-- 100 <- not found-- <0 <- error
Deklaracje wymagane, aby móc skorzystać z wartości!
Podstawowa obsługa błędów – zmienne systemowe SQLSTATE, SQLCODE
115/125IBM DB2, L.Banachowski
Deklaracja nazwanego wyjątku
DECLARE nazwa-wyjątku CONDITION FOR SQLSTATE ’xxxxx’;
Specyfikacja obsługi wyjątkuDECLARE CONTINUE HANDLER FOR SQLSTATE ’xxxxx’
EXIT SQLEXCEPTIONUNDO SQLWARNING
NOT FOUNDnazwa-wyjątku
instrukcja-SQL;
Obsługa wyjątków
116/125IBM DB2, L.Banachowski
CREATE PROCEDURE divide ( IN numerator INTEGER,IN denominator INTEGER, OUT result INTEGER)LANGUAGE SQLBEGINDECLARE overflow CONDITION FOR SQLSTATE '22003';DECLARE CONTINUE HANDLER FOR overflow
RESIGNAL SQLSTATE '22375' ; - zmiana wyjątkuIF denominator = 0 THEN
SIGNAL overflow; - wymuszenie wyjątkuELSE
SET result = numerator / denominator;END IF;
END
Przykład
117/125IBM DB2, L.Banachowski
PrzykładCREATE PROCEDURE ITERATOR() LANGUAGE SQLBEGINDECLARE at_end INTEGER DEFAULT 0;DECLARE not_found CONDITION FOR SQLSTATE '02000'; -dekl.wyj. not_foundDECLARE c1 CURSOR FOR ....;DECLARE CONTINUE HANDLER FOR not_foundSET at_end = 1;OPEN c1;ftch_loop1: LOOP
FETCH c1 INTO v_dept, v_deptname, v_admdept;IF at_end = 1 THEN
LEAVE ftch_loop1;ELSEIF v_dept = 'D01' THEN
ITERATE ftch_loop1;END IF;INSERT INTO department (deptno, deptname, admrdept)VALUES ( 'NEW', v_deptname, v_admdept);
END LOOP;CLOSE c1;END
1. Nie znaleziono wiersza – warunek not_found3. Kontynuuj
2. Obsługa wyjatku not_foundUstaw at_end=1
118/125IBM DB2, L.Banachowski
SET string1 = ’UPDATE tab1 SET column1 =’ ||CHAR(variable1);
EXECUTE IMMEDIATE string1;
GET DIAGNOSTICS variable1 = ROW_COUNT;
Dynamiczny SQL - EXECUTE IMMEDIATE
119/125IBM DB2, L.Banachowski
DECLARE statement1 STATEMENT;
SET string1 = ’UPDATE tab1 SET col1 = ? ’ || ’WHERE col2 = ?’;
PREPARE statement1 FROM string1;
EXECUTE statement1 USING var1,var2;
…
Dynamiczny SQL - PREPARE
120/125IBM DB2, L.Banachowski
-- Załóżmy, że sygnatura procedury wygląda:-- schema1.procedure1(IN,INOUT,OUT)
DECLARE statement1 STATEMENT;
SET string1 = ’CALL schema1.procedure1’ || ’(?,?,?)’;
PREPARE statement1 FROM string1;
EXECUTE statement1 INTO var1,var2USING var3,var4;
Dynamiczny SQL - parametryzowanie
121/125IBM DB2, L.Banachowski
DECLARE rs1 RESULT_SET_LOCATOR VARYING;DECLARE rs2 RESULT_SET_LOCATOR VARYING;
CALL procedure1(); -- otwiera dwa kursoryASSOCIATE RESULT SET LOCATOR (rs1, rs2) WITH PROCEDURE procedure1;
ALLOCATE cursor1 CURSOR FOR RESULT SET rs1;ALLOCATE cursor2 CURSOR FOR RESULT SET rs2;-- ALLOCATE zawiera w sobie definicję kursoraFETCH FROM cursor1 INTO var1, var2;FETCH FROM cursor2 INTO var3;
Pobieranie zbiorów wynikowych(na serwerze bazy danych)
122/125IBM DB2, L.Banachowski
Wyzwalacze- Wykonywane przed operacją BEFORE- Wykonywane po operacji AFTER- Wykonywane na perspektywie INSTEAD OFOperacje: INSERT, DELETE, UPDATEFOR EACH STATEMENT albo FOR EACH ROW
CREATE TRIGGER ReorderAFTER UPDATE OF ON_HAND, MAX_STOCKED ON PartsREFERENCING NEW AS N_ROWFOR EACH ROWWHEN (N_ROW.ON_HAND < 0.10 * N_ROW.MAX_STOCKED) BEGIN ATOMICCALL ISSUE_SHIP_REQUEST(N_ROW.MAX_STOCKED - N_ROW.ON_HAND, N_ROW.PARTNO);END-- Podobnie OLD
123/125IBM DB2, L.Banachowski
Składnia wyzwalacza
124/125IBM DB2, L.Banachowski
Użycie NEW_TABLE w wyzwalaczu definiowanym dla instrukcji
CREATE TRIGGER Trans_his_ins1AFTER INSERT ON Cust_balanceREFERENCING NEW_TABLE AS newtabFOR EACH STATEMENTMODE DB2SQL
INSERT INTO Cust_transSELECT MIN(cust#), MAX(cust#), COUNT(*), SUM(balance), 'I',
CURRENT TIMESTAMPFROM Newtab
Przy UPDATE może użyć i OLD_TABLE i NEW_TABLE.
125/125IBM DB2, L.Banachowski
GRANT EXECUTE ON PROCEDURE proc1 TO user1;
Instrukcje SQL statyczne:- dziedziczą uprawnienia właściciela
Instrukcje SQL dynamiczne:- uprawnienia tego, kto wykonuje
Uprawnienia: statyczny / dyn. SQL