Procedury i funkcje składowane

Podobne dokumenty
Język PL/SQL Procedury i funkcje składowane

Język PL/SQL. Rozdział 4. Procedury i funkcje składowane

Podprogramy. Rozdział 11 Procedury i funkcje składowane

Język PL/SQL Pakiety podprogramów

Pakiety podprogramów Dynamiczny SQL

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

PODSTAWY BAZ DANYCH 13. PL/SQL

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Oracle PL/SQL. Paweł Rajba.

PL/SQL. Zaawansowane tematy PL/SQL

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

Język PL/SQL. Rozdział 2. Kursory

15. Funkcje i procedury składowane PL/SQL

Kursor. Rozdział 10a Kursory. Otwieranie kursora. Deklarowanie kursora

Zaawansowane bazy danych i hurtownie danych semestr I

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Pakiety są logicznymi zbiorami obiektów takich jak podprogramy, typy, zmienne, kursory, wyjątki.

Bloki anonimowe w PL/SQL

Kursor jawny. Rozdział 10a Kursory. Deklarowanie kursora (1) Deklarowanie kursora (2)

1 Wprowadzenie do bloków nazwanych 1. 2 Parametry 2. 3 Procedury i funkcje 3. 4 Pakiety 6. 5 Podsumowanie Źródła 10

PL/SQL. Zaawansowane tematy PL/SQL

Deklarowanie kursora

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Oracle PL/SQL. Paweł Rajba.

Bloki anonimowe w PL/SQL

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Deklarowanie kursora. CURSOR nazwa [ ( param1 typ1 [,param2 typ2]... ) ] [RETURN typ zwracany] IS zapytanie SQL;

1. ELEMENTY JĘZYKA PL/SQL

Ćwiczenie 13 PL/SQL. Język PL/SQL procedury, funkcje, pakiety, wyzwalacze

Składowane procedury i funkcje

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Obiektowe bazy danych Ćwiczenia laboratoryjne (?)

Bazy danych, 4. wiczenia

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

Procedury Funkcje Pakiety. Tworzenie procedury

Kursory. A. Pankowska 1

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Plan wykładu Projekt fizyczny bazy danych Wprowadzenie PL/SQL PL/SQL Cechy PL/SQL

Plan wykładu BAZY DANYCH II WYKŁAD 7. Pakiety. Zalety pakietów

SQL 4 Structured Query Lenguage

Październik Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska. Systemy baz danych - wykład III. dr inż.

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Ćwiczenie 13 PL/SQL. Język PL/SQL procedury, funkcje, pakiety, wyzwalacze

Kolekcje Zbiory obiektów, rodzaje: tablica o zmiennym rozmiarze (ang. varray) (1) (2) (3) (4) (5) Rozszerzenie obiektowe w SZBD Oracle

1. Wyzwalacze BD (ang. triggers)

Język PL/SQL. Rozdział 6. Procedury wyzwalane

Procedury wyzwalane. Rozdział 13. Procedury wyzwalane. Cele stosowania procedur wyzwalanych. Definiowanie procedury wyzwalanej DML

Bazy danych. Plan wykładu. Złczenia tabel. Perspektywy cd. Wykład 9: Programowanie aplikacji baz danych po stronie serwera. Sekwencje Wyzwalacze

Tabele wykorzystywane w przykładach

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Plan wykładu PL/SQL. PL/SQL - historia TWORZENIE APLIKACJI BAZODANOWYCH

PODSTAWY BAZ DANYCH. 17. Obiektowość w Oracle. 2009/2010 Notatki do wykładu "Podstawy baz danych"

Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne, perspektywy wbudowane.

Oracle11g: Programowanie w PL/SQL

Ćwiczenia 2 IBM DB2 Data Studio

Bazy Danych i Usługi Sieciowe

Oracle Developer Suite. Budowa aplikacji użytkownika końcowego

Język PL/SQL. Rozdział 3. Obsługa błędów wykonania Wyjątki predefiniowane i użytkownika, zgłaszanie i obsługa wyjątków.

Język PL/SQL Wprowadzenie

Systemowe aspekty baz

BAZA DANYCH SIECI HOTELI

Plan wykładu BAZY DANYCH II WYKŁAD 9. Dynamiczny SQL. Dynamiczny SQL

Multimedialne bazy danych - laboratorium

PL/SQL. Lidia Małkiewicz i Cezary Skubała

Zaawansowane bazy danych i hurtownie danych semestr I

Wprowadzenie do języka PL/SQL. Język PL/SQL Wprowadzenie. Struktura blokowa programu. Przykładowy program w PL/SQL. Zmienne rekordowe.

ZASTOSOWANIE PROCEDUR, FUNKCJI I PAKIETÓW

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

Plan wykładu BAZY DANYCH II WYKŁAD 4. Co to jest kursor? Rodzaje kursorów

Bazy danych i usługi sieciowe

Oracle PL/SQL. Paweł Rajba.

Język SQL. Rozdział 2. Proste zapytania

Język PL/SQL Wprowadzenie

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Systemowe aspekty baz danych

Plan wykładu BAZY DANYCH II WYKŁAD 2. Bloki. Struktura bloku

Systemy baz danych 2 laboratorium Projekt zaliczeniowy

Wykład 9. Pakiety w języku PL/SQL

Hurtownia Świętego Mikołaja projekt bazy danych

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Post-relacyjne bazy danych

Plan wykładu BAZY DANYCH II WYKŁAD 5. Kolekcje. Tablice asocjacyjne Kolekcje Tablice asocjacyjne VARRAY Tablice zagnieżdżone

Indeksy. Indeks typu B drzewo

PL/SQL co, gdzie i dlaczego?

Oracle10g: Programowanie w PL/SQL

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze

Tworzenie raportów XML Publisher przy użyciu Data Templates

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

Struktura bazy danych

Transkrypt:

Procedury i funkcje składowane Zmienne podstawienia i zmienne wiązane, podprogramy, procedury składowane, typy argumentów, wywoływanie procedur, funkcje składowane, poziomy czystości funkcji, funkcje tablicowe 1

Zmienne podstawienia Zmienne definiowane przez użytkownika mogą być użyte w miejsce nazw relacji, atrybutów lub jako wartości atrybutów. Zmienna podstawienia nie może być pierwszym słowem polecenia. Zmienne podstawienia są zawsze typu CHAR. Polecenie DEFINE bez parametrów wyświetla listę wszystkich zmiennych podstawienia. DEFINE mytable = 'PRACOWNICY' DEFINE myvalue = 'PROFESOR' SELECT ** FROM &mytable WHERE etat etat = '&myvalue'; UNDEFINE mytable UNDEFINE myvalue 2

Zmienne wiązane Zmienne wiązane to zmienne deklarowane w SQL*Plus lub innym środowisku zewnętrznym, które są dostępne w programach PL/SQL. Mogą służyć do przekazywania wartości z PL/SQL do SQL i do optymalizacji zapytań. W PL/SQL zachowują się jak zwykłe zmienne. VARIABLE x NUMBER BEGIN SELECT COUNT(*) INTO :x :x FROM pracownicy; END; PRINT x 3

Zmienne wiązane kursorowe Zmienne wiązane kursorowe pozwalają na odczytanie w SQL*Plus wyniku zapytania umieszczonego w bloku PL/SQL. Mogą być stosowane zarówno w anonimowych blokach PL/SQL, jak i jako parametr lub typ wynikowy procedury lub funkcji. VARIABLE x REFCURSOR BEGIN OPEN :x :x FOR SELECT ** FROM pracownicy; END; PRINT x 4

Podprogramy Procedury (wykonują określone akcje), funkcje (wykonują obliczenia i zwracają wartości) i pakiety (zbierają w całość logicznie powiązane procedury, funkcje, zmienne i kursory): przechowywane w bazie danych w postaci skompilowanej i źródłowej (źródło dostępne poprzez USER_SOURCE) postać skompilowana zwiększenie szybkości działania współdzielone przez wielu użytkowników Zalety: rozszerzalność modularność łatwość pielęgnowania kodu możliwość wielokrotnego użycia kodu ukrycie szczegółów implementacji 5

Definiowanie procedury CREATE [OR [OR REPLACE] PROCEDURE specyfikacja nazwa_procedury [[(argument,...)...)]] IS IS... deklaracje stałych, zmiennych, kursorów BEGIN... ciało --polecenia PL/SQL i i SQL SQL END [nazwa_procedury]; nazwa procedury musi być unikalna w ramach schematu (lub pakietu) między słowami kluczowymi IS i BEGIN umieszczamy deklaracje wszystkich zmiennych i kursorów lokalnych między słowami kluczowymi BEGIN i END umieszczamy kod PL/SQL, który wykonuje dana procedura 6

Argumenty procedur nazwa [[ IN IN OUT IN IN OUT ]] typ typ [[ DEFAULT wartość ]] w liście argumentów nie podajemy rozmiaru argumentu (tylko typ) argument formalny: używany w deklaracji procedury i w części wykonywalnej PL/SQL argument aktualny: używany przy wywoływaniu procedury IN Wartość przekazywana do programu przez referencję W programie zachowuje się jak stała OUT Wartość zwracana do środowiska przez kopiowanie W programie zachowuje się jak nie zainicjalizowana zmienna IN OUT Wartość przekazywana do programu i zwracana do środowiska przez kopiowanie W programie zachowuje się jak zainicjalizowana zmienna Musi być literałem, wyrażeniem, stałą lub zmienną Musi być zmienną Musi być zmienną 7

Przykład procedury CREATE CREATE OR OR REPLACE REPLACE PROCEDURE PROCEDUREsprawdz_asystentow (p_id_zesp (p_id_zespin IN NUMBER, NUMBER, p_ilu_asystentow p_ilu_asystentowout OUT NUMBER) NUMBER) IS IS v_starszy_asystent v_starszy_asystent pracownicy%rowtype; BEGIN BEGIN SELECT SELECT COUNT(*) COUNT(*) INTO INTO p_ilu_asystentow p_ilu_asystentow FROM FROM pracownicy pracownicy WHERE WHERE id_zesp id_zesp = p_id_zesp p_id_zespand AND etat etat = 'ASYSTENT'; 'ASYSTENT'; FOR FORcur_rec cur_recin IN (SELECT (SELECT** FROM FROM pracownicy pracownicy WHERE WHERE id_zesp id_zesp = p_id_zesp p_id_zespand AND etat etat = 'ASYSTENT') 'ASYSTENT') LOOP LOOP IF IF (MONTHS_BETWEEN(SYSDATE, cur_rec.zatrudniony)/12) > 5 THEN THEN DBMS_OUTPUT.PUT_LINE('Asystent ' ' cur_rec.nazwisko cur_rec.nazwisko ' ' pracuje pracuje ponad ponad 5 lat'); lat'); END END IF; IF; END END LOOP; LOOP; EXCEPTION EXCEPTION WHEN WHEN NO_DATA_FOUND NO_DATA_FOUND THEN THEN DBMS_OUTPUT.PUT_LINE('W zespole zespole ' ' p_id_zesp p_id_zesp ' ' nie nie ma maasystentow asystentow '); '); END ENDsprawdz_asystentow; // 8

Wywołanie procedur i funkcji (PL/SQL) VARIABLE nr_zespolu NUMBER VARIABLE liczba_asystentow NUMBER BEGIN :nr_zespolu := := 20; 20; sprawdz_asystentow(:nr_zespolu,:liczba_asystentow); END; // PRINT liczba_asystentow Wywołanie funkcji (SQL) SELECT moja_funkcja(placa_pod) FROM pracownicy; UWAGA: wołanie funkcji z poziomu SQL jest możliwe tylko wtedy gdy funkcja posiada odpowiedni poziom czystości 9

Czystość funkcji Aby funkcja mogła być wywoływana z poziomu SQL, musi ona posiadać odpowiedni poziom czystości funkcja wywoływana z instrukcji SELECT nie może modyfikować żadnych wartości w bazie danych funkcja wywoływana z instrukcji INSERT, UPDATE, DELETE nie może odczytywać i modyfikować żadnej tabeli, której dotyczy instrukcja funkcja wywoływana z instrukcji SELECT, INSERT, UPDATE, DELETE nie może zawierać instrukcji sterujących sesją i transakcjami oraz instrukcji DDL Poziom czystości deklaruje się za pomocą dyrektywy RESTRICT_REFERENCES: RNDS, RNPS Reads No Database/Package State WNDS, WNPS Writes No Database/Package State TRUST brak kontroli czystości funkcji 10

Definiowanie funkcji CREATE [OR [OR REPLACE] FUNCTION nazwa_funkcji [[(argument,...)...)]] RETURN typ typ IS IS... BEGIN... END [nazwa_funkcji]; specyfikacja typ typ zwracany deklaracje stałych, zmiennych, kursorów ciało --polecenia PL/SQL i i SQL SQL nazwa funkcji musi być unikalna w ramach schematu (lub pakietu) po słowie kluczowym RETURN umieszczamy typ zwracany przez funkcję między słowami kluczowymi IS i BEGIN umieszczamy deklaracje wszystkich zmiennych i kursorów lokalnych między słowami kluczowymi BEGIN i END umieszczamy kod PL/SQL, który wykonuje dana funkcja w kodzie PL/SQL musi się znaleźć instrukcja RETURN 11

Przykład funkcji CREATE CREATE OR OR REPLACE REPLACE FUNCTION FUNCTION podatek podatek (p_id_prac (p_id_prac IN IN NUMBER) NUMBER) RETURN RETURN NUMBER NUMBER IS IS CURSOR CURSOR c_pracownik c_pracownik IS IS SELECT SELECT ** FROM FROM pracownicy pracownicy WHERE WHERE id_prac id_prac = p_id_prac; p_id_prac; v_pracownik v_pracownik pracownicy%rowtype; v_roczne_zarobki v_roczne_zarobki NUMBER; NUMBER; v_podatek v_podatek NUMBER; NUMBER; BEGIN BEGIN OPEN OPEN c_pracownik; c_pracownik; FETCH FETCH c_pracownik c_pracownik INTO INTO v_pracownik; v_pracownik; CLOSE CLOSE c_pracownik; c_pracownik; v_roczne_zarobki v_roczne_zarobki := := 12 12 ** v_pracownik.placa_pod + NVL(v_pracownik.placa_dod, 0); 0); IF IF (v_roczne_zarobki (v_roczne_zarobki > 5000) 5000) THEN THEN v_podatek v_podatek := := 0.40 0.40 ** v_roczne_zarobki; v_roczne_zarobki; ELSIF ELSIF (v_roczne_zarobki (v_roczne_zarobki > 3000) 3000) THEN THEN v_podatek v_podatek := := 0.30 0.30 ** v_roczne_zarobki; v_roczne_zarobki; ELSE ELSE v_podatek v_podatek := := 0.19 0.19 ** v_roczne_zarobki; v_roczne_zarobki; END END IF; IF; RETURN RETURN v_podatek; v_podatek; END END podatek; podatek; 12

Funkcje tablicowe Funkcje tablicowe dają w wyniku kolekcję krotek. Nazwy tych funkcji mogą być wykorzystywane zamiast nazw tabel. Funkcje tablicowe mogą również przyjmować kolekcję krotek jako parametr. Funkcje mogą być zrównoleglone oraz potokowane, co zwiększa efektywność przetwarzania poprzez: wielowątkowe wykonanie funkcji eliminację przechowywania wyników pośrednich zmniejszenie czasu odpowiedzi na pierwsze wyniki iteracyjne dostarczanie kolejnych krotek wyniku W przypadku funkcji potokowanych do dostarczenia krotki do wyniku służy komenda PIPE ROW (...) 13

Przykład funkcji tablicowej CREATE TYPE CharTyp AS AS TABLE OF OF VARCHAR2(20); CREATE OR OR REPLACE FUNCTION FPracownicy(p_etat CHAR) RETURN CharTyp PIPELINED AS AS BEGIN FOR x IN IN (( SELECT ** FROM pracownicy WHERE etat=p_etat) LOOP PIPE ROW (x.nazwisko); END LOOP; RETURN; END FPracownicy; SELECT ** FROM TABLE( FPracownicy('ASYSTENT') ); ); SELECT ** FROM TABLE( FPracownicy('PROFESOR') ); ); 14