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