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 Oracle. Funkcje tworzymy za pomocą instrukcji CREATE FUNCTION. CREATE FUNCTION nazwa_funkcji RETURN typ_zwracanych_danych 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;.
CREATE OR REPLACE FUNCTION suma RETURN INT liczba1 INT:=90; liczba2 INT:=100; suma INT; suma:=liczba1+liczba2; RETURN suma;
Użycie parametrów w funkcjach 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 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).
Przykład funkcji liczącej średnią arytmetyczną dwóch liczb: CREATE OR REPLACE FUNCTION srednia (liczba1 IN NUMBER, liczba2 IN NUMBER) RETURN NUMBER srednia NUMBER; srednia:=(liczba1+liczba2)/2; RETURN srednia; Wywołanie funkcji srednia: SELECT srednia(1,2) FROM dual;
Przykład funkcji, która pobiera ciąg reprezentujący kod pocztowy i zwraca wynik w formacie 99-999: CREATE OR REPLACE FUNCTION kod_pocztowy (kod IN char) RETURN char RETURN substr(kod,1,2) - substr(kod,3); Wywołanie funkcji kod: SELECT kod_pocztowy( 56009 ) FROM dual;
Tablice i typ rekordowy W PL/SQL można definiować złożone typy danych (np. tablice, rekordy), w oparciu o typy bazowe (skalarne). 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. DECLARE TYPE tabela1 TABLE OF VARCHAR2(30); TYPE tabela2 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. DECLARE TYPE tabela1 TABLE OF VARCHAR2(30);// definicje TYPE tabela2 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: DECLARE TYPE ListaKursow 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: DECLARE TYPE Klient VARRAY(100) OF VARCHAR2(16); vip Klient := Klient();//inicjalizujemy pusta tablicę varray IF vip NOT NULL THEN...// warunek daje TRUE... END IF;