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

Podobne dokumenty
Pakiety podprogramów Dynamiczny SQL

Język PL/SQL Pakiety podprogramów

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

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

Procedury i funkcje składowane

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

Podprogramy. Rozdział 11 Procedury i funkcje składowane

Oracle PL/SQL. Paweł Rajba.

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

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

PODSTAWY BAZ DANYCH 13. PL/SQL

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

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

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

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

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

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

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

Zaawansowane bazy danych i hurtownie danych semestr I

Procedury Funkcje Pakiety. Tworzenie procedury

ZASTOSOWANIE PROCEDUR, FUNKCJI I PAKIETÓW

PL/SQL. Zaawansowane tematy PL/SQL

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

PL/SQL. Zaawansowane tematy PL/SQL

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

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Oracle PL/SQL. Paweł Rajba.

Bloki anonimowe w PL/SQL

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

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

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

15. Funkcje i procedury składowane PL/SQL

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

Oracle11g: Programowanie w PL/SQL

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

SQL 4 Structured Query Lenguage

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

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

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

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

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.

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

Deklarowanie kursora

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

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Plan ćwiczenia. Rozdział 16 Uwierzytelnianie i autoryzacja w bazie danych. Użytkownicy i schematy (1) Użytkownicy i schematy (2) baza danych: ZESP99

Oracle PL/SQL. Paweł Rajba.

1. Wyzwalacze BD (ang. triggers)

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

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

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

Oracle10g: Programowanie w PL/SQL

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

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

BAZA DANYCH SIECI HOTELI

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

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Indeksy. Indeks typu B drzewo

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

Oracle PL/SQL. Paweł Rajba.

Tabele wykorzystywane w przykładach

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

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

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

Ćwiczenia 2 IBM DB2 Data Studio

Instrukcje SQL można podzielić na pięć kategorii, które zostały przedstawione w poniższej tabeli.

Bloki anonimowe w PL/SQL

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

SQL w języku PL/SQL. 2) Instrukcje języka definicji danych DDL DROP, CREATE, ALTER, GRANT, REVOKE

Bazy Danych i Usługi Sieciowe

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

Obowiązuje od wersji

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

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Oracle PL/SQL. Paweł Rajba.

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

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

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

Bazy danych, 4. wiczenia

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

Bazy danych i usługi sieciowe

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

Obiektowe bazy danych

Wstęp do programowania 2

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

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

Zarządzanie bazą danych. Bazy Danych i Systemy informacyjne Wykład 4. Piotr Syga

W PostgreSQL mamy do dyspozycji nie tylko funkcje wbudowane, ale również możemy tworzyć własne. Są one zapisywane w tabeli systemowej pg_proc.

1. ELEMENTY JĘZYKA PL/SQL

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

Język PL/SQL Wprowadzenie

Tworzenie widoku CREATE OR REPLACE VIEW [nazwa_widoku] AS SELECT [nazwy_kolumn] FROM [nazwa_tablicy];

Obiektowe bazy danych Ćwiczenia laboratoryjne (?)

Hurtownia Świętego Mikołaja projekt bazy danych

BAZY DANYCH W APLIKACJACH SIECIOWYCH

2 PL/SQL - podstawy Zmienne i stałe Operatory SQL w PL/SQL Instrukcje sterujące... 8

Comarch ERP XL Business Intelligence Start. Migracja do wersji 2018

Systemowe aspekty baz

Język PL/SQL Wprowadzenie

Transkrypt:

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL Pakiety podprogramów, specyfikacja i ciało pakietu, zmienne i kursory pakietowe, pseudoinstrukcje (dyrektywy kompilatora), dynamiczny SQL. 1

Pakiety Pakiet (ang. package) grupuje powiązane logicznie typy, procedury, funkcje, zmienne i kursory. Składa się ze specyfikacji (interfejsu) i ciała (implementacji). W specyfikacji mieszczą się deklaracje typów, zmiennych, stałych, kursorów, wyjątków i podprogramów. W ciele mieści się implementacja specyfikacji. aplikacja specyfikacja ciało baza danych 2

Cele stosowania pakietów Cechy: modularność ukrycie informacji użytkownikowi jest udostępniana tylko specyfikacja pakietu (interfejs), natomiast implementacja procedur i funkcji jest niewidoczna zwiększenie funkcjonalności zmienne zadeklarowane w pakietach istnieją przez całą sesję użytkownika; dzięki temu mogą one służyć do wzajemnej komunikacji różnych procesów zwiększenie szybkości działania przy pierwszym odwołaniu do pakietu cała jego zawartość jest ładowana do pamięci współdzielenie przez wielu użytkowników możliwość zmiany implementacji (ciała) pakietu bez konieczności rekompilacji modułów zależnych 3

Kiedy rozważać użycie pakietów Gdy chcemy ukryć sposób przetwarzania danych zamiast wykonywać operacje DML bezpośrednio na tabelach dostarczamy proceduralne API. Pakiet pełni wówczas rolę interfejsu nazywanego tableapi lub transaction API. Gdy chcemy uniknąć umieszczania tych samych stałych wewnątrz różnych modułów Gdy chcemy zgrupować logicznie powiązane ze sobą moduły programowe Gdy chcemy skorzystać z danych wyliczonych raz na poziomie sesji i dostępnych w buforze przez cały czas jej trwania 4

Definiowanie pakietu CREATE [OR REPLACE] PACKAGE nazwa_pakietu IS deklaracje stałych, zmiennych, kursorów dostępnych na zewnątrz pakietu specyfikacja deklaracje procedur i funkcji END [nazwa_pakietu]; CREATE [OR REPLACE] PACKAGE BODY nazwa_pakietu IS deklaracje stałych, zmiennych, kursorów dostępnych wewnątrz pakietu ciało definicje procedur i funkcji END [nazwa_pakietu]; 5

Przykład pakietu CREATE OR REPLACE PACKAGE kadry IS PROCEDURE nowy_pracownik(p_nazwisko VARCHAR2); FUNCTION podatek(p_id_prac NUMBER) RETURN NUMBER; bledny_pracownik EXCEPTION; END kadry; CREATE OR REPLACE PACKAGE BODY kadry IS v_liczba_pracownikow NUMBER := 0; PROCEDURE nowy_pracownik(...) IS BEGIN... END nowy_pracownik; FUNCTION podatek(...) RETURN NUMBER IS BEGIN... END podatek; END kadry; 6

Wywołanie procedury lub funkcji pakietu Do zdefiniowanego w specyfikacji pakietu obiektu (procedury, funkcji, zmiennej, kursora, I) odwołujemy się spoza pakietu poprzedzając jego nazwę nazwą pakietu, np. EXECUTE kadry.usun_pracownika(230) SELECT kadry.zl_na_usd(placa_pod) FROM pracownicy; Odwołanie do obiektu z wnętrza jego własnego pakietu nie wymaga prefiksu CREATE OR REPLACE PACKAGE BODY kadry IS v_liczba_pracownikow NUMBER := 0; PROCEDURE nowy_pracownik(...) IS BEGIN v_liczba_pracownikow:= v_liczba_pracownikow + 1; I END nowy_pracownik; I 7

Kompilowanie pakietu ALTER PACKAGE nazwa COMPILE PACKAGE PACKAGE BODY; Uwaga! Jeśli zmiana definicji procedur lub funkcji pakietu nie zmienia ich sygnatury (nie ma konieczności rekompilacji specyfikacji, rekompilacji podlega jedynie ciało), nie ma konieczności unieważnienia (a co za tym idzie, rekompilacji) podprogramów spoza pakietu, je wywołujących. Usuwanie pakietu DROP PACKAGE PACKAGE BODY nazwa; 8

Zmienne pakietowe Deklarowane w specyfikacji (dostępne publicznie) lub ciele (dostępne tylko z podprogramów) pakietu. Zachowują nadane wartości przez całą sesję użytkownika. CREATE OR REPLACE PACKAGE xyz IS l_name VARCHAR(30); FUNCTION x(...) ; END xyz; I EXECUTE xyz.l_name := 'ABC'; BEGIN DBMS_OUTPUT.PUT_LINE(xyz.l_name); END; 9

Inicjalizacja pakietu W momencie pierwszego odwołania do dowolnego elementu z pakietu zawartość całego pakietu zostaje załadowana do bufora. Zmienne i kursory mogą być inicjalizowane w części inicjalizacyjnej pakietu. CREATE OR REPLACE PACKAGE BODY xyz IS... l_name VARCHAR(30); l_date_of_birth DATE; FUNCTION x(...) RETURN...; BEGIN l_name := SYS_CONTEXT ('USERENV', 'SESSION_USER'); l_date_of_birth := SYSDATE;... END xyz; 10

Pakiet bez ciała Np. jako składnica stałych, używanych w systemie. CREATE OR REPLACE PACKAGE stałe IS c_pi constant number(3,2) := 3.14; c_e constant number(3,2) := 2.72; c_euler constant number(5,4) := 0.5772; END stałe; BEGIN DBMS_OUTPUT.PUT_LINE(stałe.c_PI); END; 11

Kursory pakietowe Kursory mogą być deklarowane zarówno w specyfikacji pakietu jak i w ciele Stan kursora (otwarty, zamknięty, wskaźnik na określony rekord wyniku zapytania) utrzymywany jest przez cały stan sesji Deklaracja kursora w specyfikacji może mieć dwie postacie: pełną deklaracja kursora wraz z przypisanym zapytaniem częściową deklaracja jedynie nagłówka kursora bez zapytania (zapytanie jest wówczas definiowane w ciele pozwalając na jego ukrycie) CREATE OR REPLACE PACKAGE pakiet_z_kursorem IS CURSOR c_pracownicy(p_id_zesp IN pracownicy.id_zesp%type) RETURN pracownicy%rowtype; PROCEDURE otworz_kursor(p_id_prac pracownicy.id_zesp%type); PROCEDURE zamknij_kursor; END pakiet_z_kursorem; 12

Kursory pakietowe CREATE OR REPLACE PACKAGE BODY pakiet_z_kursorem IS CURSOR c_pracownicy (p_id_zesp IN pracownicy.id_zesp%type) RETURN pracownicy%rowtype IS SELECT * FROM pracownicy WHERE id_zesp = p_id_zesp; PROCEDURE otworz_kursor (p_id_zesp pracownicy.id_zesp%type) IS BEGIN IF NOT (c_pracownicy%isopen) THEN OPEN c_pracownicy(p_id_zesp); END IF; END; PROCEDURE zamknij_kursor IS BEGIN CLOSE c_pracownicy; END; END pakiet_z_kursorem; DECLARE r_prac pakiet_z_kursorem.c_pracownicy%rowtype; BEGIN pakiet_z_kursorem.otworz_kursor(10); FETCH pakiet_z_kursorem.c_pracownicy INTO r_prac; IF pakiet_z_kursorem.c_pracownicy%found THEN dbms_output.put_line(r_prac.nazwisko); ELSE pakiet_z_kursorem.zamknij_kursor; END IF; END; anonymous block completed WEGLARZ 2X anonymous block completed MAREK 13

Słownik bazy danych USER_OBJECTS -informacja o pakietach w schemacie użytkownika SELECT object_name, object_type, status FROM user_objects WHERE object_type IN ('PACKAGE', 'PACKAGE BODY'); USER_SOURCE - kod źródłowy: specyfikacji pakietu: SELECT text FROM user_source WHERE name = 'PLACE' AND type = 'PACKAGE' ORDER BY line; ciała pakietu: SELECT text FROM user_source WHERE name = 'PLACE' AND type = 'PACKAGE BODY' ORDER BY line; 14

Model uprawnień Określenie modelu uprawnień wykorzystywanego podczas wykorzystywania składowych pakietu możliwe jest jedynie na poziomie pakietu (specyfikacji) i obejmuje wszystkie składowe pakietu CREATE OR REPLACE PACKAGE kadry AUTHID CURRENT_USER IS PROCEDURE nowy_pracownik(p_nazwisko VARCHAR2); FUNCTION podatek(p_id_prac NUMBER) RETURN NUMBER; bledny_pracownik EXCEPTION; END kadry; 15

Dynamiczny SQL Dynamiczny SQL pozwala na konstruowanie i wykonywanie poleceń, których pełna treść nie jest znana w momencie kompilacji aplikacji, lecz dopiero w trakcie wykonywania programu. Dynamiczny SQL pozwala na: konstrukcję elastycznego kodu (np. procedury operującej na tablicy przekazanej jako parametr, dynamicznego tworzenia warunków w klauzuli WHERE) konstrukcję kodu wykonywalnego w trakcie działania programu wykonywanie w bloku PL/SQL instrukcji DDL (np. CREATE TABLE) oraz DCL (GRANT, ALTER SESSION) i instrukcji sterujących sesją, zabronionych w statycznym PL/SQL 16

Polecenie EXECUTE IMMEDIATE Polecenie EXECUTE IMMEDIATE przygotowuje (parsuje) i natychmiast wykonuje polecenie SQL bądź blok PL/SQL EXECUTE IMMEDIATE polecenie [ INTO zmienna_1 [, zmienna_2,... ] rekord ] [ USING [ IN OUT IN OUT ] arg_wiązania_1 [, [ IN OUT IN OUT ] arg_wiązania_2 ]... ] [ RETURNING INTO arg_wiązania_3,... ] ; polecenie to ciąg znaków zawierający polecenie SQL (bez średnika na końcu) zmienna_i to zmienna, do której zostaną wczytane wyniki zapytania arg_wiązania_i to wyrażenie, którego wartość jest przekazywana do polecenia 17

Przykład dynamicznego SQL (1) DECLARE sql_stmt VARCHAR2(100); BEGIN EXECUTE IMMEDIATE 'CREATE TABLE bonus (id NUMBER, wartosc NUMBER)'; sql_stmt := 'ALTER SESSION SET NLS_DATE_FORMAT=''DAY MONTH YYYY'' '; EXECUTE IMMEDIATE sql_stmt; EXECUTE IMMEDIATE 'declare v_podatek number; begin v_podatek:=' END; 'kadry.podatek(150); dbms_output.put_line(v_podatek); end;'; 18

Przykład dynamicznego SQL (2) DECLARE sql_stmt VARCHAR2(100); bnd_id_zesp number(6); bnd_nazwa VARCHAR2(5) := 'KADRY'; bnd_adres VARCHAR2(25) := 'SKLODOWSKIEJ-CURIE 1'; prac_rec pracownicy%rowtype; BEGIN sql_stmt := 'INSERT INTO zespoly VALUES (seq_zespol.nextval,:1, :2) ' 'RETURNING id_zesp INTO :3'; EXECUTE IMMEDIATE sql_stmt USING bnd_nazwa, bnd_adres RETURNING INTO bnd_id_zesp; sql_stmt := 'SELECT * FROM pracownicy WHERE id_prac = :id'; EXECUTE IMMEDIATE sql_stmt INTO prac_rec USING 100; DBMS_OUTPUT.PUT_LINE(prac_rec.nazwisko ' - ' prac_rec.etat); END; 19

Przykład dynamicznego SQL (3) DECLARE TYPE prac_tab_typ IS TABLE of pracownicy%rowtype; prac_tablica prac_tab_typ; v_id_zesp zespoly.id_zesp%type := &id_zesp; BEGIN EXECUTE IMMEDIATE 'SELECT* FROM pracownicy WHERE id_zesp=:1' BULK COLLECT INTO prac_tablica USING v_id_zesp; FOR i IN 1..prac_tablica.last LOOP DBMS_OUTPUT.PUT_LINE('Pracownik ' prac_tablica(i).nazwisko ' zarabia ' to_char(prac_tablica(i).placa_pod)); END LOOP; END; 20