PL/SQL

Transkrypt

PL/SQL
PL/SQL
Część 1 – Oracle SQL
Piotr Medoń
Cele
• Różnice w budowie zapytań bazodanowych
pomiędzy bazami SQL Server oraz Oracle
• Standardowe funkcje Oracle SQL
2
Wprowadzenie do SQL
SQL (Structured Query Language)
• DDL (Data Definition Language) służy do
tworzenia, modyfikowania i usuwania
obiektów bazodanowych np. CREATE TABLE
• DML (Data Manipulation Language) służy do
modyfikowania oraz przeglądania danych
(INSERT, UPDATE, DELETE, SELECT)
3
Relacja (Tabela)
Nazwa
relacji
(tabeli)
Atrybut
(kolumna)
liczbowy
Atrybut
(kolumna)
tekstowy
Atrybut (kolumna)
daty
IMIE_OSOBY
DATA_URODZENIA
1
ADAM
01-01-1990
2
ANDRZEJ
31-05-1975
3
ANNA
04-03-1970
4
BEATA
20-10-1095
KARTOTEKA ID_OSOBY
Krotki
(Rekordy)
4
Budowa zapytania SQL
SELECT kolumny
FROM nazwy_tabel
WHERE warunki i złączenia;
5
Różnice pomiędzy bazami
SQL Server i Oracle
SQL Server
Oracle
SELECT nie wymaga FROM
SELECT zawsze wymaga FROM
np.
SELECT GETDATE()
W każdej instalacji bazy danych Oracle istnieje tabela o
nazwie DUAL, która zawsze zawiera jeden element
np.
SELECT SYSDATE FROM DUAL
6
Różnice pomiędzy bazami
SQL Server i Oracle
SQL Server
Oracle
Kolumny mogą być
autonumerowane
(właściwość IDENTITY)
Nie istnieje właściwość kolumny umożliwiająca
autonumerowanie.
Istnieją sekwencje – obiekty generujące kolejne liczby,
bezpieczne w korzystaniu przez wiele wątków.
Na przykład, aby wstawić wartość do tabeli faktury
należy wykonać polecenie:
INSERT INTO faktury (ID_FAKTURY, KWOTA)
VALUES(faktury_sekwencja.NEXTVAL, 1000);
7
Różnice pomiędzy bazami
SQL Server i Oracle
SQL Server
Oracle
Brak Oracle’owej konwencji
zewnętrznego łączenia tabel
Istnieją dwie konwencje zewnętrznego łączenia tabel
ISO:
SELECT p.imie, d.nazwa_dzialu
FROM pracownicy p
LEFT OUTER JOIN
dzial d
ON p.id_dzialu = d.id_dzialu
oraz Oracle’owa:
SELECT p.imie, d.nazwa_dzialu
FROM pracownicy p, dzial d
WHERE p.id_dzialu = d.id_dzialu (+)
8
Różnice pomiędzy bazami
SQL Server i Oracle
SQL Server
Oracle
Możliwe łączenia tabel:
INNER JOIN
CROSS JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
Możliwe łączenia tabel:
INNER JOIN
JOIN … USING
NATURAL JOIN
CROSS JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
9
Różnice pomiędzy bazami
SQL Server i Oracle
SQL Server
Oracle
Jeżeli kolumny, po których łączymy dwie tabele mają
te same nazwy w obu tabelach, możemy użyć łączenie
„JOIN USING”.
Poniższe zapytania są równoważne:
SELECT p.imie, d.nazwa_dzialu
FROM pracownicy p
JOIN
dzial d
ON p.id_dzialu = d.id_dzialu
SELECT p.imie, d.nazwa_dzialu
FROM pracownicy p
JOIN
dzial d
USING (dzial_id)
10
Różnice pomiędzy bazami
SQL Server i Oracle
SQL Server
Oracle
Za pomocą NATURAL JOIN łączymy tabele używając
wszystkich kolumn o takiej samej nazwie.
Poniższe zapytania będą równoważne, jeżeli jedyną
kolumną o wspólnej nazwie w tabelach pracownicy
oraz dzial będzie id_dzialu:
SELECT p.imie, d.nazwa_dzialu
FROM pracownicy p
JOIN
dzial d
ON p.id_dzialu = d.id_dzialu
SELECT p.imie, d.nazwa_dzialu
FROM pracownicy p
NATURAL JOIN
dzial d
11
Różnice pomiędzy bazami
SQL Server i Oracle
SQL Server
Oracle
Wyrażenie TOP:
Nie ma wyrażenia TOP
Select top 5 * from
pracownicy
Istnieje pseudokolumna ROWNUM oznaczająca numer wiersza
zapytania, np.
Select * from pracownicy where rownum <= 5;
W bazie Oracle wyniki zapytania są sortowane na końcu
wykonania zapytania lub podzapytania. Aby uzyskać
informację o 5 najlepiej zarabiających pracownikach należy
skorzystać z konstrukcji podzapytania:
SELECT *
FROM ( SELECT *
FROM pracownicy
ORDER BY zarobki DESC)
WHERE ROWNUM <= 5;
12
Różnice pomiędzy bazami
SQL Server i Oracle
SQL Server
Oracle
Domyślnie nie rozpoznaje
różnic dużych i małych liter
podczas porównywania
danych tekstowych (case
insensitive).
Zawsze rozpoznaje różnice dużych i małych liter.
Poniższe zapytania są
równoważne:
Aby wykonać wyszukiwanie ignorujące różnie małych i
dużych liter należy wykonać:
SELECT *
FROM pracownicy p
WHERE UPPER(p.imie) = ‘ADAM’
SELECT *
FROM pracownicy p
WHERE p.imie= ‘Adam’
SELECT *
FROM pracownicy p
WHERE p.imie= ‘ADAM’
13
Podstawowe typy danych
• Tekstowy (VARCHAR2)
• Numeryczny (NUMBER)
• Data (DATE)
14
Operatory porównań
• Poniższe operatory zwracają wartość określoną TRUE lub
FALSE, gdy oba argumenty nie są wartościami NULL
• Gdy jeden z argumentów jest NULL, operator zwróci wartość
nieokreślony
Warunek
Operator
Przykład
równość
=
a=b
większe od
mniejsze od
>
<
a>b
a<b
większe równe
mniejsze równe
>=
<=
a>=b
a<=b
nierówność
!=
<>
a!=b
a<>b
pomiędzy
BETWEEN .. AND
a BETWEEN b AND c
15
Tekstowe funkcje PL/SQL
• CONCAT (tekst1, tekst2)
– Służy do łączenia dwóch wartości tekstowych w
jeden.
• konkatenacja za pomocą ||
– Służy do łączenia wartości tekstowych w jeden.
CONCAT(‘labo’, ‘ratorium’) zwróci ‘laboratorium’
‘Ala’ || ‘ ma’ || ‘ kota’ zwróci ‘Ala ma kota’
16
Tekstowe funkcje PL/SQL
• UPPER (tekst)
– Zamienia wszystkie litery parametru tekstowego
na duże
• LOWER (tekst)
– Zamienia wszystkie litery parametru tekstowego
na małe
UPPER(‘DoktRYna’) zwróci ‘DOKTRYNA’
LOWER(‘InfoRMATYKA’) zwróci ‘informatyka’
17
Tekstowe funkcje PL/SQL
• INITCAP (tekst)
– Zamienia wszystkie pierwsze litery każdego słowa
na duże
– Zamienia pozostałe litery parametru tekstowego
na małe
INITCAP(‘konferenCJA pRASOWA‘) zwróci
‘Konferencja Prasowa’
18
Tekstowe funkcje PL/SQL
• LTRIM(tekst[, znaki_do_usunięcia])
– Usuwa wszystkie wyspecyfikowane znaki z lewej
strony parametru tekstowego
np.
LTRIM (‘babcABC TESTa','abc‘) zwróci: 'ABC TESTa'
Domyślnymi znakami do usunięcia są spacje:
LTRIM (‘ TEST ') zwróci: ‘TEST ’
19
Tekstowe funkcje PL/SQL
• RTRIM(tekst[, znaki_do_usunięcia])
– Usuwa wszystkie wyspecyfikowane znaki z prawej
strony parametru tekstowego
np.
RTRIM (‘abc TESTcaba','abc‘) zwróci: abc TEST'
Domyślnymi znakami do usunięcia są spacje:
RTRIM (‘ TEST ‘) zwróci: ‘ TEST’
20
Tekstowe funkcje PL/SQL
• TRIM([[LEADING|TRAILING|BOTH] [znak] FROM ] tekst)
– Usuwa wyspecyfikowany znaki z lewej, z prawej lub z
obu stron parametru tekstowego
np.
TRIM(BOTH ‘a‘ FROM 'abcaa‘) zwróci: ‘bc'
Domyślnym znakiem do usunięcia jest pojedyncza
spacja:
TRIM(‘ TEST ‘) zwróci: ‘TEST’
21
Tekstowe funkcje PL/SQL
• LENGTH (tekst)
– Zwraca długość parametru tekstowego (ilość
znaków)
LENGTH(‘abcde’) zwróci 5
22
Tekstowe funkcje PL/SQL
• INSTR(tekst, fragment [, odkąd_przeglądać[,
które_wystąpienie]])
– Wyszukuje zadany fragment w tekście i zwraca
jego pozycję
– Parametr tekst jest wartością tekstową do
przeszukania
– Parametr fragment jest poszukiwaną wartością
tekstową
INSTR(‘Litwo, ojczyzno’,’czy’)
INSTR(‘Litwo, ojczyzno’,’o’)
23
Tekstowe funkcje PL/SQL
• INSTR(tekst, fragment [, odkąd_przeglądać[,
które_wystąpienie]])
– Parametr odkąd_przeglądać jest wskazuje miejsce, od
którego funkcja zacznie przeglądać tekst w
poszukiwaniu zadanego fragmentu. Parametr ten jest
parametrem opcjonalnym, gdy ominięty – domyślną
wartością jest 1.
– Gdy Parametr odkąd_przeglądać jest ujemny, miejsce,
od którego funkcja zacznie przeglądać tekst wyznaczane
jest od końca, a tekst szukany jest do początku.
INSTR(‘Litwo, ojczyzno’,’o’,6)
INSTR(‘Litwo, ojczyzno’,’o’,-5)
24
Tekstowe funkcje PL/SQL
• INSTR(tekst, fragment [, odkąd_przeglądać[,
które_wystąpienie]])
– Parametr które_wystąpienie wskazuje numer
wystąpienia fragmentu w tekście. Parametr ten jest
parametrem opcjonalnym, gdy ominięty –
domyślną wartością jest 1.
INSTR(‘Litwo, ojczyzno’,’o’,1,3)
INSTR(‘Litwo, ojczyzno’,’o’,-1,2)
25
Tekstowe funkcje PL/SQL
• SUBSTR(tekst, odkąd_wyciąć[, ilość_znaków])
– zwraca fragment tekstu
– parametr tekst jest źródłową wartością tekstową
– parametr odkąd_wyciąć wskazuje początkową pozycję
np. SUBSTR(‘abcdefgh’,3,4) zwróci ‘cdef’
– Parametr ilość_znaków jest parametrem opcjonalnym,
gdy ominięty - funkcja zwraca cały tekst do końca
np. SUBSTR(‘abcdefgh’,3) zwróci ‘cdefgh’
– gdy parametr odkąd_wyciąć jest ujemny, pozycja ta
jest liczona od końca
np. SUBSTR(‘abcdefgh’,-5,2) zwróci ‘de’
26
Tekstowe funkcje PL/SQL
• LPAD(tekst, długość[, tekst2])
– Zwraca parametr tekst lewostronnie, uzupełniony
do długości zadanej w parametrze długość,
ciągami znaków parametru tekst2
lpad('ABC',10,'123') zwraca ‘1231231ABC’
– Domyślnym parametrem tekst2 jest spacja
lpad(‘test',10) zwraca ‘
test’
27
Tekstowe funkcje PL/SQL
• RPAD(tekst, długość[, tekst2])
• Zwraca parametr tekst lewostronie
uzupełniony do długości długość ciągami
znaków parametru tekst2
rpad('ABC',10,'123') zwraca ABC1231231
• Domyślnym parametrem tekst2 jest spacja
lpad(‘test',10) zwraca ‘test ’
28
Funkcje konwertujące
• TO_CHAR(liczba[, format[, ustawienie_NLS]])
– Konwertuje liczbę na tekst zgodnie z zadanym
formatem
Liczba
Format
-12345
99999999
0
99.99
12.134
999.99
Wynik
-12345
.00
12,134
29
Funkcje konwertujące
• TO_NUMBER(tekst[,format[,ustawienie_NLS]])
Tekst
Format
Wynik
12345-
99999999MI
-12345
0
99.99
0
12.134
999.9999
12.134
30
Funkcje konwertujące
• Formaty liczb
Format
Przykład
Znaczenie
9
9999
Oznacza cyfrę
0
9900
Oznacza cyfrę lub zero. Przykład zawsze zwróci co najmniej 2
cyfry
.
999.99
Oznacza znak ‘.’ dziesiętny
,
999,999,999.99
Oznacza znak ‘,’ grupujący
D
999D99
Oznacza znak dziesiętny zgodny z ustawieniami sesji
G
999G999G999D99
Oznacza znak grupujący zgodny z ustawieniami sesji
31
Funkcje konwertujące
• Formaty liczb
Format
Przykład
Znaczenie
S
99900D00S
Znak liczby + lub -
MI
99900D00MI
Minus w przypadku liczby ujemnej, spacja w przypadku
liczby dodatniej
L, C
99900L
Oznacza kod waluty
FM
FM99900D00
Usuwa spacje z początku przekonwertowanego ciągu
RN
RN
Liczba pisana cyframi rzymskimi
32
Funkcje konwertujące
• TO_CHAR(data[, format[, ustawienie_NLS]])
– Konwertuje parametr daty na tekst zgodnie z
formatem
Przykład
Wynik
TO_CHAR(SYSDATE,’YYYY’)
2012
TO_CHAR(SYSDATE,’MM’)
03
TO_CHAR(SYSDATE,’YYYY-MM’)
2012-03
TO_CHAR(SYSDATE,'YYYY !@#$%^&*()-=_+ MM')
2012 !@#$%^&*()-=_+ 03
33
Funkcje konwertujące
• TO_DATE(tekst[, format[, ustawienie_NLS]])
– Konwertuje parametr tekstowy zgodny z
formatem na datę
Przykład
Wynik
TO_DATE(‘2012-03-07’,’YYYY-MM-DD’)
01-03-2012 00:00:00
34
Funkcje konwertujące
• Formaty dat
Format
Znaczenie
Przykład
YYYY
Rok 4-cyfrowy
2012
YYY, YY, Y
3, 2 lub1 najmniej znacząca cyfra roku
012, 12, 2
Q
Kwartał (1-4)
1
MM
Numer miesiąca (’01’-’12’; Styczeń = ’01’).
03
MON
Skrócona nazwa miesiąca
MAR
MONTH
Długa nazwa miesiąca
MARZEC
Month
Długa nazwa miesiąca
Marzec
RM
Miesiąc rzymski (Styczeń = ‘I’)
III
35
Funkcje konwertujące
• Formaty dat
Format
Znaczenie
Przykład
WW
Tydzień roku
16
W
Tydzień miesiąca
1
D
Dzień tygodnia 1-7 (niedziela= 1)
7
DAY
Nazwa dnia
SOBOTA
DD
Dzień miesiąca 01-31
03
DDD
Dzień roku (001-366).
071
DY
Skrócona nazwa dnia
SO
36
Funkcje konwertujące
• Formaty dat
Format
Znaczenie
Przykład
HH
Godzina 01-12
04
HH12
Godzina 01-12
04
HH24
Godzina 00-23
16
MI
Minuta(00-59)
25
SS
Sekunda (00-59).
43
SSSSS
Sekunda dnia liczona od północy (0-86399).
59126
37
Funkcje konwertujące
• TO_CHAR(data[, format[, ustawienie_NLS]])
– Parametr ustawienie_NLS jest parametrem
niewymagalnym, zawiera informację o
ustawieniach językowych, z którymi funkcja ma
być wykonana
to_char(sysdate, 'MONTH', ‘NLS_DATE_LANGUAGE=''Polish''')
-> zwróci ‘LUTY’
to_char(sysdate, 'MONTH‘)
to_char(sysdate, 'MONTH', ‘NLS_DATE_LANGUAGE=''English''')
-> zwrócą ‘FEBRUARY ‘
38
Funkcje dodatkowe
• USER
• Funkcja bezparametrowa zwracająca nazwę
użytkownika bazodanowego bieżącej sesji
SELECT USER FROM DUAL;
39
Funkcje dodatkowe
• NVL(parametr1, parametr2)
• Zwraca wartość parametru1, lub w przypadku
gdy jest on NULL, zastępuje go parametrem2
parametr1
Wynik
Nie NULL
parametr1
NULL
parametr2
np.
NVL(ls_adres_zamieszkania,ls_adres_zameldowania)
40
Funkcje dodatkowe
• COALESCE(parametr1, parametr2[,
parametr3...])
• Zwraca wartość pierwszego parametru, który
nie jest NULL
• np. COALESCE(ls_nr_komorkowy,
ls_nr_stacjonarny, ls_nr_sluzbowy,
ls_nr_do_zony)
41
Funkcje dodatkowe
• NVL2(parametr1, wartość_gdy_nie_null,
wartość_gdy_null)
• Zwraca wartość_gdy_nie_null lub
wartość_gdy_null w zależności od parametru
parametr1
parametr1
Wynik
Nie NULL
wartość_gdy_nie_null
NULL
wartość_gdy_null
NVL2(ld_data_konca,’Zakonczono’,’Trwa’)
42
Funkcje dodatkowe
• NULLIF(parametr1,parametr2)
• Zwraca NULL, gdy parametry są równe. W
przeciwnym wypadku zwraca parametr1.
NULLIF(ls_drugie_imie,’brak’)
43
Funkcje dodatkowe
• DECODE(parametr0, szukana1, wartość1,
[, szukana2, wartość2]…[, wartość_domyślna])
• parametr0 jest wartością porównywaną
• szukana1 jest wartością, do której następuje
porównanie
• wartość1 jest wartością zwracaną, gdy
parametr0=szukana1
• Wartość_domyślna jest niewymagalną wartością
zwracaną, gdy parametr0 nie jest żadną z szukanych
DECODE(ls_plec,’M’,’Mezczyzna’,’K’,’Kobieta’,’Nieznana’);
44
Funkcje dodatkowe
• Funkcje dodatkowe NVL, NVL2, DECODE,
COALESCE, NULLIF są przeciążone i zwracają:
– datę, gdy parametrami są daty
– liczbą, gdy parametrami są liczby
– tekst, gdy parametrami są zmienne tekstowe
45
Funkcje matematyczne
• ABS(x)
• Zwraca wartość bezwzględną parametru x:
• ABS(-1.4) zwraca 1.4
46
Funkcje matematyczne
• SIGN(x)
• Zwraca wartość wskazującą znak parametru x
Warunek
Wynik
x<0
-1
x=0
0
x>0
1
47
Funkcje matematyczne
• CEIL(x)
• Zwraca najmniejszą całkowitą wartość większą od x
CEIL(2.4) zwraca 3
CEIL(-1.6) zwraca -1
• FLOOR(x)
• Zwraca największą całkowitą wartość mniejszą od x
FLOOR(2.4) zwraca 2
FLOOR(-1.6) zwraca -2
48
Funkcje matematyczne
• ROUND(x[,ilość_miejsc_dziesiętnych])
• Zaokrągla liczbę x do żądanej ilość miejsc
dziesiętnych
ROUND(126.1251, 2) zwraca 126.13
ROUND(126.1251, -1) zwraca 130
• Domyślną wartością parametru
ilość_miejsc_dziesiętnych jest 0
ROUND(2.4) zwraca 2
ROUND(-1.6) zwraca -2
49
Funkcje matematyczne
• TRUNC(x[,ilość_miejsc_dziesiętnych])
• Obcina liczbę x do żądanej ilości miejsc dziesiętnych
(obcina końcówkę)
TRUNC(126.1251, 2) zwraca 125.12
TRUNC(-126.1251, -1) zwraca -120
• Domyślną wartością parametru
ilość_miejsc_dziesiętnych jest 0, co oznacza usunięcie
części ułamkowej
TRUNC(2.4) zwraca 2
TRUNC(-1.6) zwraca -1
50
Funkcje matematyczne
• GREATEST(x1, x2[, x3 …])
• Zwraca największą spośród liczb
GREATEST(11,12,13,10) zwraca 13
• LEAST(x1, x2[, x3 …])
• Zwraca najmniejszą spośród liczb
LEAST(8,4,5,6) zwraca 4
51
Funkcje matematyczne
• MOD(n,m)
• Zwraca resztę z dzielenia liczb n i m
IF MOD(ln_wiek,10) = 0 THEN
DBMS_OUTPUT.PUT_LINE(‘Okragla rocznica!’);
END IF;
52
Funkcje matematyczne
•
•
•
•
•
SQRT(n), POWER(n,m)
SIN(x), COS(x), TAN(x)
ASIN(x), ACOS(x), ATAN(x)
SINH(x), COSH(x), TANH(x)
LN(x), EXP(x)
53
Funkcje daty
• SYSDATE
• Funkcja bezparametrowa
• Zwraca bieżącą datę
BEGIN
dbms_output.put_line(‘Dzisiejsza data: ‘
|| TO_CHAR(SYSDATE));
END;
54
Funkcje daty
• ADD_MONTHS(data, ilość_miesięcy)
• Zwraca datę późniejszą o ilość_miesięcy
Przykład
Wynik
add_months(DATE ‘2012-01-01', 3)
2012-04-01
add_months(DATE '2012-01-01', -2) 2011-11-01
add_months(DATE '2012-01-31', 1)
2012-02-29
add_months(DATE '2012-02-28', 1)
2012-03-28
add_months(DATE '2012-02-29', 1)
2012-03-31
55
Funkcje daty
• MONTHS_BETWEEN
• Zwraca ilość miesięcy pomiędzy datami
MONTHS_BETWEEN(DATE '2012-01-15',DATE '2011-02-15')
MONTHS_BETWEEN(DATE '2012-02-01',DATE '2012-01-15')
56
Funkcje daty
• LAST_DAY(data)
• Zwraca ostatni dzień miesiąca
Przykład
Wynik
LAST_DAY(DATE ‘2012-01-01')
2012-01-31
LAST_DAY(DATE '2012-02-15')
2012-02-29
57
Funkcje daty
• ROUND(data[, stopień])
• Zaokrągla datę do odpowiedniego stopnia
zaokrąglenia
Przykład
Wynik
ROUND(DATE ‘2012-02-12', ‘MM’)
2012-02-01
ROUND(DATE '2012-02-21', ‘MM’)
2011-03-01
ROUND(DATE '2012-02-31',’YYYY’)
2012-01-01
ROUND(TO_DATE(‘2012-01-12 15:14:13’,
’YYYY-MM-DD HH24:MI:SS’))
2012-01-13
58
Funkcje daty
• TRUNC(data[, stopień])
• Obcina datę do odpowiedniego stopnia
zaokrąglenia
Przykład
Wynik
TRUNC(DATE ‘2012-02-12', ‘MM’)
2012-02-01
TRUNC(DATE '2012-02-21', ‘MM’)
2011-02-01
TRUNC(DATE '2012-02-31',’YYYY’)
2012-01-01
TRUNC(TO_DATE(‘2012-01-12 15:14:13’,
’YYYY-MM-DD HH24:MI:SS’))
2012-01-12
59
Funkcje daty
• Możliwe stopnie zaokrąglenia i obcięcia dat:
Stopień zaokrąglenia/obcięcia
Parametr stopień
Rok
YYYY, YY
Kwartał
Q
Miesiąc
MONTH, MM
Dzień
DD
Pierwszy dzień tygodnia
DAY, DY, D
Godzina
HH, HH12, HH24
Minuta
MI
60