Bloki anonimowe w PL/SQL



Podobne dokumenty
Bloki anonimowe w 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

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

PODSTAWY BAZ DANYCH 13. PL/SQL

Oracle PL/SQL. Paweł Rajba.

PL/SQL. Zaawansowane tematy PL/SQL

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

Procedury i funkcje składowane

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

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

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

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

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

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

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

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

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

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

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

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

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

1. ELEMENTY JĘZYKA PL/SQL

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

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

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

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

15. Funkcje i procedury składowane PL/SQL

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

Składowane procedury i funkcje

DECLARE VARIABLE zmienna1 typ danych; BEGIN

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

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

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba.

Deklarowanie kursora

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

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

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

Podstawy Programowania C++

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

SQL 4 Structured Query Lenguage

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Oracle PL/SQL. Paweł Rajba.

Oracle PL/SQL. Paweł Rajba.

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

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.

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

PL/SQL. Część 1 Bloki PL/SQL. Piotr Medoń

Zaawansowane bazy danych i hurtownie danych semestr I

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

Pakiety podprogramów Dynamiczny SQL

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Język PL/SQL Wprowadzenie

Kursory - pobieranie danych z baz danych do programów PL/SQL

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

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

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

Oracle11g: Programowanie w PL/SQL

1 Podstawy c++ w pigułce.

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

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Język PL/SQL Wprowadzenie

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

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

41. Zmienne lokalne muszą mieć nazwę, którą poprzedza (maksymalnie 128 znaków) oraz typ (każdy z wyjątkiem: text, ntext oraz image)

LibreOffice Calc VBA

Tabele wykorzystywane w przykładach

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

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Materiały do laboratorium MS ACCESS BASIC

Podprogramy. Rozdział 11 Procedury i funkcje składowane

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

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Administracja i programowanie pod Microsoft SQL Server 2000

BAZA DANYCH SIECI HOTELI

Systemy GIS Tworzenie zapytań w bazach danych

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Wyzwalacze (triggery) Przykład

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

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

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

Ref. 7 - Język SQL - polecenia DDL i DML

Oracle11g: Wprowadzenie do SQL

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Ćwiczenia 2 IBM DB2 Data Studio

Relacyjne bazy danych. Podstawy SQL

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Język SQL, zajęcia nr 1

Podstawy programowania skrót z wykładów:

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

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

SQL :: Data Definition Language

Paweł Rajba

Wykład 5. SQL praca z tabelami 2

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

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

Zaawansowane bazy danych i hurtownie danych semestr I

Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.

Oracle10g: Programowanie w PL/SQL

Transkrypt:

Język PL/SQL PL/SQL to specjalny język proceduralny stosowany w bazach danych Oracle. Język ten stanowi rozszerzenie SQL o szereg instrukcji, znanych w proceduralnych językach programowania. Umożliwia pisanie bloków programów, funkcji, procedur,... Możliwości, jakie daje język PL/SQL to: korzystanie z pętli oraz instrukcji warunkowych; dostęp do danych w plikach; poprawienie wydajności bazy danych; tworzenie rozbudowanych programów, do wykonania zadań niemożliwych do zrealizowania za pomocą samego SQL-a; obsługa błędów i wyjatków. W języku PL/SQL można tworzyć cztery rodzaje programów: 1. bloki anonimowe; 2. procedury składowane; 3. wyzwalacze; 4. funkcje. Bloki anonimowe w PL/SQL W języku PL/SQL można tworzyć bloki anonimowe, nie posiadające nazwy. Nie są zapisywane w bazie danych. Można ich używać w celu jednorazowego wykonania kodu. deklaracje zmiennych kod wykonywalny W poniższym przykładzie każdemu pracownikowi w tabeli employee dajemy podwyżkę o 100$. kwota NUMBER(4); kwota:=100; UPDATE employee SET salary=salary+kwota; Deklaracje zmiennych i stałych Zmienne i stałe deklarujemy w sekcji bloku anonimowego. Deklaracja zmiennej ma postać: zmienna typ_danych; Deklaracja stałej: stala1 CONSTANT typ_danych := wartość; Przykładowa sekcja deklaracji: liczba1 NUMBER(4); liczba2 INT :=90; liczba3 INT NOT NULL :=0; tekst1 VARCHAR2(30); data1 DATE default SYSDATE; stala1 CONSTANT CHAR(5) := tekst ; Użycie w deklaracji zmiennej instrukcji:=wyrażenie umożliwia inicjalizację wartości zmiennej w przeciwnym razie zmiennej jest przypisywane NULL. Do inicjalizacji wartości zmiennej zamiast operatora := można użyć klauzuli DEFAULT. Polecenia SQL w programach PL/SQL W kodzie programu PL/SQL można używać instrukcji INSERT, UPDATE, DELETE podobnie, jak w języku SQL. Instrukcji SELECT używamy łacznie z klauzulą INTO.

Polecenia SQL w programach PL/SQL Polecenia SQL w programach PL/SQL W kodzie programu PL/SQL można używać instrukcji INSERT, UPDATE, DELETE podobnie, jak w języku SQL. Instrukcji SELECT używamy łacznie z klauzulą INTO. Przykład: użycie UPDATE w bloku anonimowym: kwota NUMBER(5):=200; dzial INT; dzial:=90; UPDATE employees SET salary=salary+kwota WHERE department_id=dzial; W kodzie programu PL/SQL można używać instrukcji INSERT, UPDATE, DELETE podobnie, jak w języku SQL. Instrukcji SELECT używamy łacznie z klauzulą INTO. Przykład: użycie INSERT w bloku anonimowym: id char(2); nazwa varchar2(40); region number:=1; nazwa:= Poland ; id:= PL ; INSERT INTO countries(country_id,country_name,region_id) VALUES ( id,nazwa,region); Instrukcji DELETE używa się analogicznie. W przypadku SELECT musimy zastosować klauzulę INTO. Uwaga. Zapytanie SELECT w tym przypadku musi zwracać zawsze tylko jeden wiersz. W klauzuli INTO podajemy listę zmiennych, do których przypisywane są wartości z kolejnych pól zwracanych przez SELECT. Liczba i typy zmiennych muszą odpowiadać liczbie i typom wyrażeń zwracanych przez SELECT. 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 będziemy używać w taki sam sposób, jak wbudowanych funkcji Oracla. Funkcje tworzymy za pomocą instrukcji CREATE FUNCTION. CREATE FUNCTION nazwa_funkcji RETURN typ_zwracanych_danych IS deklaracje zmiennych kod RETURN wynik; Wywołanie funkcji może nastąpić z poziomu instrukcji SQL, np. SELECT nazwa_funkcji FROM dual; lub z poziomu innego programu PL/SQL. Usunięcie funkcji odbywa się za pomocą instrukcji DROP FUNCTION nazwa;.

Użycie parametrów w funkcjach CREATE OR REPLACE FUNCTION suma RETURN INT IS liczba1 INT:=90; liczba2 INT:=100; suma INT; suma:=liczba1+liczba2; RETURN suma; Funkcje oraz procedury mogą mieć parametry. Wyróżniamy trzy typy parametrów: IN - parametr tylko do odczytu, służy do przekazania danych do funkcji lub procedury; OUT - parametr wyjściowy, umożliwia zwrócenie danych przez program; ma wartość NULL do momentu zainicjalizowania; IN OUT - parametr wejściowo/wyjściowy; podczas wywoływania programu służy do przekazania do niego danych, umożliwia zwrócenie danych; używamy, gdy dane wejściowe mają zostać zmienione podczas działania programu. Parametry wejściowe W funkcjach zazwyczaj używa się tylko parametrów typu IN. Definicja funkcji z uwzględnieniem parametrów wejściowych (IN) ma postać: CREATE FUNCTION nazwa_funkcji (parametr1 IN typ_danych, parametr2 IN typ_danych,...) RETURN typ_zwracanych_danych IS deklaracje zmiennych kod RETURN wynik; Uwaga. Używając typów CHAR, NUMBER, VARCHAR2 dla parametrów funkcji i procedur nie podajemy zakresu (jest wyliczany na podstawie danych wejściowych i wyjściowych). Definicja funkcji liczącej średnią dwóch liczb: CREATE OR REPLACE FUNCTION srednia (liczba1 IN NUMBER, liczba2 IN NUMBER) RETURN NUMBER IS srednia NUMBER; srednia:=(liczba1+liczba2)/2; RETURN srednia; Wywołanie funkcji srednia: SELECT srednia(1,2) FROM dual;

Instrukcje sterujace języka PL/SQL Instrukcja przypisania := zmienna :=wyrażenie; np. kwota:=100; akt_data:=sysdate; Instrukcje warunkowe Instrukcja warunkowaif...then...end IF. Składnia instrukcji IF: IF warunek THEN instrukcje; ELSIF warunek THEN instrukcje; ELSE instrukcje END IF; Jeżeli warunek podany w wyrażeniu IF jest spełniony, wykonywany jest blok instrukcji występujący za THEN. W przeciwnym przypadku i gdy spełniony jest warunek wyrażenia ELSIF, wykonywany jest blok instrukcji występujący po tym wyrażeniu. Jeżeli ten warunek nie jest spełniony, wykonywane są instrukcje z bloku ELSE. Uwaga. Użycie klauzul ELSIF oraz ELSE nie jest wymagane. Przy testowaniu i uruchamianiu aplikacji składających się z kodu PL/SQL wygodnie jest pobierać dane do testowania z klawiatury i wypisywać informacje o przebiegu obliczeń na ekran. Realizuje się to za pomocą instrukcji: DBMS_OUTPUT.Put_line(wyrażenie_napisowe); Instrukcja warunkowa CASE test INT; wynik VARCHAR2(10); test:=1; IF test<0 THEN wynik:= ujemna ; ELSIF test<=2 THEN wynik:= przedział [0,2] ; ELSE wynik:= większe od 2 ; END IF; dbms_output.put_line(wynik); Instrukcja CASE występuje w dwóch formach. Użycie CASE z wyszukiwaniem, jak poniżej powoduje, że sprawdzane są kolejno warunki w klauzulach WHEN, do momentu natrafienia na taki, który będzie spełniony. Wykonywany będzie wówczas odpowiedni blok instrukcji. Pozostałe warunki nie są sprawdzane. Jeżeli żaden warunek nie jest spełniony, wykonywane są instrukcje z klauzuli ELSE (o ile taka klauzula istnieje). CASE WHEN warunek1 THEN instrukcje1; WHEN warunek2 THEN instrukcje2;... ELSE instrukcje; END CASE;

Instrukcja warunkowa CASE Użycie CASE: i NUMBER(1) := 3; CASE WHEN i=1 THEN DBMS_OUTPUT.PUT_LINE( i wynosi 1 ); WHEN i>2 THEN DBMS_OUTPUT.PUT_LINE( i jest większe od 2 ); ELSE DBMS_OUTPUT.PUT_LINE( i wynosi i); END CASE; Druga forma instrukcji CASE sprawdza, czy wartość danego wyrażenia (zwanego selektorem) jest równa jednemu z wymienionych wyrażeń. Jeżeli tak, to wykonywane są odpowiednie instrukcje. Jeżeli wartość wyrażenia nie zostanie dopasowana, wykonywana jest klauzula ELSE (o ile występuje). CASE selektor WHEN wyrażenie1 THEN instrukcje1; WHEN wyrażenie2 THEN instrukcje2;... ELSE instrukcje; END CASE; Pętle. Pętla LOOP Pętle LOOP jest definiowana przy użyciu klauzul LOOP i END LOOP. Aby zakończyć działanie pętli LOOP, musimy podać warunek wyjścia: albo korzystając z klauzuli EXIT WHEN albo stosując instrukcję IF z klauzulą EXIT. Przykład pętli LOOP: i INT; i:=1; LOOP dbms_output.put_line( i= TO_CHAR(i)); EXIT WHEN i=10; i:=i+1; END LOOP; Pętla WHILE Pętli WHILE używamy aby instrukcja (lub blok instrukcji) była wykonywana, dopóki spełniony jest warunek pętli. WHILE warunek LOOP instrukcje END LOOP Definiując warunek w pętli WHILE należy pamiętać, że pętla będzie wykonywana tak długo, jak długo warunek określony w pętli będzie spełniony. Aby uniknąć pętli nieskończonej, należy umieścić w ciele pętli kod odpowiedzialny za zmianę tego warunku na fałszywy. Uwaga. Działanie pętli WHILE można również przerwać, stosując klauzulę EXIT WHEN.

Pętla FOR Podstawowe typy danych w PL/SQL Pętli FOR używamy, gdy znamy liczbę iteracji. FOR iterator IN 1..n LOOP instrukcje END LOOP Zmienna iterator użyta do zdefiniowania pętli FOR nie jest deklarowana. Jej zasięg ogranicza się tylko do pętli. Nie można się do niej odnosić poza blokiem pętli. Domyślnie podaje się najpierw mniejszą, a potem większą z wartości zakresu iteratora, którego wartość w każdej iteracji jest zwiększana o 1. Aby to odwrócić, należy zdefiniować pętlę z opcją REVERSE: FOR iterator IN REVERSE 1..n LOOP END LOOP. NUMBER[(precision,scale)]: przechowuje liczby zarówno stałoprzecinkowe, jak zmiennoprzecinkowe. Parametr precision określa ilość cyfr całej liczby, parametr scale liczbę miejsc po przecinku. Zakres parametru precision wynosi 38 (domyślnie 38), skala może być z przedziału od -84 do 127(domyślnie 0). Liczbę całkowitą definiujemy następująco: NUMBER(p) lub NUMBER(p,0). Można też użyć podtypu INT. Liczby stałoprzecinkowe definiujemy podając obydwa parametry, liczby zmiennoprzecinkowe - tylko NUMBER, bez parametrów. Podstawowe typy danych w PL/SQL CHAR(n) - typ znakowy stałej długości, n musi być z zakresu od 1 do 32767. Jeżeli nie zdefiniujemy zakresu, domyślnie przyjmowane jest n=1. VARCHAR2(n) - typ znakowy zmiennej długości, n musi być określone, zakres od 1 do 32767. BOOLEAN - typ logiczny, przechowuje tylko wartości TRUE, FALSE, i NULL (która odpowiada brakowi wartości lub wartości nieokreślonej). Na zmiennych typu BOOLEAN można wykonywać tylko operacje logiczne. DATE - przechowuje datę oraz czas. Tablice i typ rekordowy W PL/SQL można definiować własne typy danych (np. tablice, rekordy), w oparciu o typy bazowe. Definicja typu tablicowego: tablica o zadeklarowanym maksymalnym rozmiarze: VARRAY(n) OF typ danych; aby zadeklarować tablicę nie określając maksymalnego rozmiaru, używamy konstrukcji TABLE OF typ danych, np. TYPE tabela1 IS TABLE OF VARCHAR2(30); TYPE tabela2 IS VARRAY(5) OF INTEGER; tab1 tabela1; tab2 tabela2; tab1 := tabela1( IiESP, MatSP, IDSP ); tab2 := tabela2(1, 2, 3, 4, 5); tab1(2):= MatSD ; tab2(1):=7;

Tablice w PL/SQL Tablice typu VARRAY(n) będziemy nazywali varray, natomiast tablice typu TABLE - tabelami zagnieżdżonymi. Zanim zostanie zainicjalizowana za pomocą konstruktora tablica, varray lub tabela zagnieżdżona, ma wartość NULL (tzn. cała kolekcja ma wartość NULL, a nie jej poszczególne elementy). Konstruktor to wbudowana funkcja, o nazwie takiej samej, jak nazwa typu, która tworzy kolekcję z elementów do niej przekazanych. TYPE tabela1 IS TABLE OF VARCHAR2(30);// definicje TYPE tabela2 IS VARRAY(5) OF INTEGER;// typów tab1 tabela1; tab2 tabela2; tab1 := tabela1( IiE, Mat, ID ); //konstruktor tab2 := tabela2(1, 2, 3, 4, 5); //konstruktor Tablice w PL/SQL Dobrze jest inicjalizować kolekcję w momencie jej deklaracji: TYPE ListaKursow IS TABLE OF VARCHAR2(16); kursy ListaKursow := ListaKursow( Mat 1111, Hist 3100, Biol 2005 ); Można także stworzyć pustą kolekcję (ale NOT NULL), w tym celu wywołujemy konstruktor bez argumentów: TYPE Klient IS VARRAY(100) OF VARCHAR2(16); vip Klient := Klient();//inicjalizujemy pusta tablicę varray IF vip IS NOT NULL THEN...// warunek daje TRUE... END IF; Metody kolekcji Przy używaniu kolekcji, można wykorzystać poniższe metody, aby ułatwić pracę z kolekcjami i uczynić kod bardziej czytelnym: EXISTS COUNT LIMIT FIRST i LAST PRIOR i NEXT EXTEND TRIM DELETE Metoda kolekcji to wbudowana funkcja lub procedura operująca na kolekcji. Aby się do niej odwołać, używamy notacji kropkowej: nazwa_kolekcji.metoda[(parametry)] Uwaga. jeżeli kolekcja jest NULL, to każda metoda poza EXISTS wywołuje wyjątek (COLLECTION_IS_NULL). EXISTS EXISTS(n) zwraca TRUE, jeżeli n-ty element kolekcji istnieje (FALSE w każdym innym przypadku, czyli też, jak indeks jest spoza zakresu), np. IF kursy.exists(i) THEN kursy(i) := nowy_kurs; END IF; Można użyć np., do rzadkich tablic zagnieżdżonych. COUNT COUNT zwraca liczbę elementów, które aktualnie zawiera kolekcja, np.: IF projekty.count = 25 THEN... lub jako zakres pętli: FOR i IN 1..kursy.COUNT LOOP... COUNT jest użyteczne, bo aktualny rozmiar tabeli nie zawsze jest znany. Uwaga. Dla tablic varray, COUNT jest zawsze równe LAST. Dla tabel zagnieżdżonych, COUNT zazwyczaj jest równe LAST, ale, jeżeli wykasujemy elementy za środka tabeli, to wówczas COUNT będzie mniejsze niż LAST (COUNT nie zlicza wykasowanych elementów).

LIMIT Dla tablic varray, LIMIT określa maksymalny rozmiar (czyli liczbę elementów, które może przechować) danej tablicy. FIRST i LAST Zwracają pierwszy i ostatni(czyli najmniejszy i największy) indeks w kolekcji. Jeżeli kolekcja jest pusta, zwracają NULL. Można wykorzystać FIRST i LAST do określenia zakresu pętli (pod warunkiem, że każdy element z tego zakresu istnieje): FOR i IN kursy.first..kursy.last LOOP... PRIOR(n) i NEXT(n) - używamy do iterowania po elementach kolekcji. PRIOR(n) zwraca indeks elementu poprzedzającego element o indeksie n, NEXT(n) - indeks kolejnego. Jeżeli dany element nie istnieje, obie metody zwracają NULL. Można użyć PRIOR lub NEXT do przeglądania np. tabeli zagnieżdżonej, z której niektóre elementy zostały wykasowane: i := kursy.first; //indeks pierwszego elementu WHILE i IS NOT NULL LOOP wykonujemy operacje na kursy(i) i := kursy.next(i); //pobieramy indeks kolejnego END LOOP; Zwiększanie rozmiaru kolekcji: metoda EXTEND Procedura ma trzy formy: EXTEND dodaje pusty element do kolekcji (na końcu); EXTEND(n) dodaje n pustych elementów do kolekcji; EXTEND(n,i) dodaje n kopii i-tego elementu. Np., dodajemy pięć razy kopię pierwszego elementu do tabeli zagnieżdżonej: kursy.extend(5,1); uwaga. EXTEND nie można użyć do kolekcji będącej NULL. EXTEND bierze pod uwagę także wykasowane elementy, więc w poniższym kodzie, indeks ostatniego elementu w tabeli to 4, a nie 3. TYPE ListaKursow IS TABLE OF VARCHAR2(10); kursy ListaKursow; kursy := ListaKursow( Biol, Mat, Alg ); kursy.delete(3); //kasujemy element nr 3 /* PL/SQL trzyma miejsce dla elementu nr 3, zatem kolejna instrukcja odnosi się do elementu 4, a nie do 3*/ kursy.ext //dodajemy jeden pusty element kursy(4) := Fiz ;//element 4 istnieje Zmniejszanie rozmiaru kolekcji TRIM. Procedura ma dwie formy: TRIM usuwa element z końca kolekcji; TRIM(n) usuwa n elementów z końca kolekcji. Np., usuwanie trzech ostatnich elementów z tabeli zagnieżdżonej kursy: kursy.trim(3); Uwaga. jeżeli n jest spoza zakresu, TRIM(n) zwraca wyjątek (SUBSCRIPT_BEYOND_COUNT). TRIM bierze pod uwagę wykasowane elementy.

Kasowanie elementów tabel zagnieżdżonych DELETE. Procedura ma trzy formy: DELETE usuwa wszystkie elementy z kolekcji. DELETE(n) usuwa n-ty element (o ile istnieje). DELETE(m,n) usuwa elementy z zakresu od m do n. kursy.delete(2); // kasuje element 2 kursy.delete(7,7); // kasuje element 7 kursy.delete(6,3); // nic nie robi kursy.delete(3,6); // usuwa elementy od 3 do 6 Uwaga. Nie można kasować elementów w tablicach varray (są "gęste", tzn. nie można tworzyć dziur). PL/SQL trzyma miejsce dla wykasowanych elementów, wykasowany element można prosto zastąpić nowym, wystarczy mu przypisać nową wartość. Tablice i typ rekordowy Typem rekordowym (rekordem) nazywamy złożoną strukturę danych, której składowe, zwane polami, mogą należeć do różnych typów. Definicję typu rekordowego umieszczamy w sekcji bloku: TYPE nazwa IS RECORD( lista deklaracji pól rekordu ); Np.: rekord do przechowywania danych samochodu: TYPE samochod IS RECORD( marka VARCHAR2(30), rocznik INT, cena NUMBER(10) ); Zmienną rekordową deklarujemy następująco: moje_auto samochod; Odwołując się do pól rekordu używamy notacji kropkowej, np. moje_auto.marka Atrybuty %TYPE i %ROWTYPE Atrybuty %TYPE i %ROWTYPE Atrybutu %TYPE można użyć, aby zadeklarować zmienną, której typ zostanie nadany na podstawie typu danych kolumny w tabeli. Jest to użyteczne, jeżeli zmienna ma za zadanie przechowywać wartości z okreslonej kolumny tabeli. Dla przykładu, aby zdefiniować zmienną v_last_name, która będzia miała taki sam typ danych, jak kolumna last_name w tabeli employee, należy użyć notacji kropkowej oraz atrybutu %TYPE: v_last_name employee.last_name%type; Podejście takie ma dwie zalety. Po pierwsze, nie musimy znać dokładnego typu danych kolumny last_name. Po drugie, jeżeli zmienimy w bazie typ danych kolumny last_name, to automatycznie zmieni się typ zmiennej v_last_name. Atrybut%ROWTYPE umożliwia zadeklarowanie zmiennej rekordowej, reprezentującej wiersz tabeli. Taki rekord może przechowywać wiersz wybrany z tabeli lub kursora. Pola rekordu mają takie same nazwy i typy danych, jak odpowiadające im kolumny. Dla przykładu, zadeklarujemy rekord dept_rec. Pola tego rekordu mają takie same nazwy i typy danych, jak kolumny w tabeli department: dept_rec department%rowtype; Aby odwołać się do pól rekordu, używamy notacji kropkowej: v_deptid := dept_rec.dept_id;

Kursory Kursory Każde polecenie SQL, umieszczone w programie PL/SQL, w trakcie wykonania zostaje skojarzone z obszarem pamięci (tzw. obszarem roboczym), w którym przechowywane są informacje o przetwarzanym poleceniu: m.in. status wykonania polecenia i zbiór odczytanych z bazy danych rekordów (w przypadku zapytania). Dostęp w programie PL/SQL do tego obszaru pamięci jest możliwy za pomocą specjalnej struktury, tzw. kursora. Kursor umożliwia: nadanie nazwy obszarowi roboczemu, dostęp do niego, pobranie z niego danych, kontrolę procesu przetwarzania danych. Rodzaje kursorów: jawne (explicit) - są deklarowane przez programistę i służą do odczytu zbioru rekordów z bazy danych, niejawne (implicit) - tworzone automatycznie dla każdego polecenia UPDATE, INSERT, DELETE i SELECT INTO, jakie zostaje umieszczone w programie. Przetwarzając kursor musimy wykonać cztery operacje: zadeklarować kursor, otworzyć go, pobrać wiersze, zamknąć kursor. Pętla kursorowa CURSOR moj_kursor IS SELECT * FROM employee WHERE dept_no= 000 ; osoba employee%rowtype; OPEN moj_kursor; FETCH moj_kursor INTO osoba; dbms_output.put_line( Dane osoby: osoba.full_name); CLOSE moj_kursor; Użycie petli kursorowej umożliwia pobranie kolejnych rekordów z kursora. Nie ma konieczności otwierania ani zamykania kursora (odpowiada za to pętla), np. CURSOR moj_kursor IS SELECT * FROM employee WHERE dept_no= 000 ; FOR osoba IN moj_kursor LOOP dbms_output.put_line( Dane osoby: osoba.full_name); END LOOP; Zmienna wierszowa osoba jest deklarowana niejawnie, jest widoczna tylko wewnątrz pętli kursorowej. Przechowuje dane kolejno pobranych rekordów z kursora.

Atrybuty kursora Atrybuty kursora określają jego właściwości. ISOPEN zwraca true, jeżeli kursor jest otwarty. ROWCOUNT zwraca liczbę wierszy, które zostały już pobrane z kursora. NOTFOUND sprawdza, czy w kursorze pozostały jeszcze jakieś wiersze. Jeżeli kursor nie zawiera już żadnych danych, to zwraca true, jeżeli w kursorze pozostał jeszcze jakiś wiersz, zwraca false. FOUND sprawdza, czy w kursorze pozostały jeszcze jakieś dane, zwraca true jeżeli tak, false przeciwnie. CURSOR kursor1 IS SELECT * FROM countries; kraj countries%rowtype; ile INT; OPEN kursor1; IF kursor1%isopen THEN Dbms_Output.put_line( otwarty ); END IF; FETCH kursor1 INTO kraj; ile:=kursor1%rowcount; CLOSE kursor1; Dbms_Output.put_line(ile); Kursory sparametryzowane Kursory sparametryzowane Poniższy kod wyświetla id oraz nazwę każdego kraju z regionu nr 1. CURSOR kraje1 IS SELECT * FROM countries WHERE region_id=1; FOR kraj IN kraje1 LOOP Dbms_Output.put_line( kraj.country_id kraj.country_name); END LOOP; Chcemy zmienić id regionu w warunku WHERE kursora, aby mieć możliwość wyboru krajów także z innych regionów. W tym celu można użyć kursora sparametryzowanego. CURSOR kraje2(id INT) IS SELECT * FROM countries WHERE region_id =id; FOR kraj IN kraje2(2) LOOP Dbms_Output.put_line( kraj.country_id kraj.country_name); END LOOP; Kursor kraje2 jest kursorem sparametryzowanym, z parametrem id.

Kursory sparametryzowane Możliwe jest określenie więcej niż jednego parametru kursora, np.: CURSOR c1 (dzial CHAR, zarobki NUMBER) IS SELECT * FROM employee WHERE dept_no=dzial AND salary >=zarobki; Używając kursora, należy przekazać wartości wszystkich parametrów, np. otwarcie kursora c1: OPEN c1( 100,2500); Można określić wartości domyślne dla parametrów kursora: CURSOR c1 (dzial CHAR, zarobki NUMBER DEFAULT 2000) IS SELECT * FROM employee WHERE dept_no=dzial AND salary >=zarobki;