Spis treści
Procedury i funkcje
Autor: Marcin Kasiński
21.01.2011 13:24:00 +0200
Podprogramy są normalnymi blokami PL/SQL, które mogą przyjmować argumenty i zwracać wartości. Struktura podprogramu składa się z takich samych podbloków, jak zwykły blok PL/SQL tj., z części deklaracyjnej, części głównej i części obsługi błędów.
Składnia tworząca procedurę ma postać
CREATE [OR REPLACE] PROCEDURE nazwa_procedury [(param1 [, param2]...)] [AUTHID { DEFINER | CURRENT_USER] {IS | AS} [PRAGMA AUTONOMOUS_TRANSACTION;] [deklaracje lokalne] BEGIN ... [EXCEPTION ...] END [nazwa_procedury];
Składnia parametru ma postać:
[IN|OUT [NOCOPY]] typ_parametru [{:= | DEFAULT} wartość początkowa]
Funkcje są swego rodzaju odmianą procedur, z tym, że funkcja zwraca wartość.
Składnia tworząca funkcję ma postać
CREATE [OR REPLACE] FUNCTION nazwa_funkcji [(param1 [, param2]...)] return typ_zwracany [AUTHID { DEFINER | CURRENT_USER] [PARALLEL_ENABLE] [DETERMINISTIC] {IS | AS} [PRAGMA AUTONOMOUS_TRANSACTION;] [deklaracje lokalne] BEGIN ... return zwracana_wartość [EXCEPTION ...] END [nazwa_funkcji];
Przykład
CREATE OR REPLACE function is_ok(value REAL) return boolean is min_value real=1.0; max_value real=10.0; return (value>=min_value) and (value<=mx_value); end is_ok;
Typy argumentów:
- INargument jest przekazywany do podprogramu i tam jest traktowany jak stała, w związku z czym w bloku podprogramu argumentowi nie możemy przypisać wartości.
- OUTargument w bloku podprogramu jest traktowany jak zwykła zmienna lokalna, do której można przypisywać wartości. Zmiany wewnątrz podprogramu są widoczne w bloku wywałującym podprogram. Argument typu OUT musi być zmienną, nie może to być stała lub wyrażenie.
- IN OUTjest to połączenie argumentu IN i OUT
- NOCOPYjest to rozszerzenie argumentu IN, OUT i IN OUT, określające że argument jest przekazywany przez nazwy, a nie przez wartość. Argument ten jest stosowany do dużych obiektów ponieważ zaoszczędza on czas potrzebny na kopiowanie danych pomiędzy blokiem głównym, a blokiem podprogramu i odwrotnie jak to ma miejsce w przypadku przekazywania argumentu przez wartość
Wywoływanie podprogramów:
W systemie Oracle mamy dwa możliwe rodzaje wywołań podprogramów różniące się sposobem przekazywania argumentów:
Notacja pozycyjna
Jest to notacja stosowana w większości języków programowania, gdzie pierwszy argument wywołania jest przyporządkowany do pierwszego argumentu definicji. Kolejne argumenty są przyporządkowane analogicznie.
Przykład definicji procedury:
procedure credit (acct_no INTEGER, amount REAL) IS ...
Przykład wywołania
credit (acct, amnt);
W powyższym wywołaniu zmienna acct przypisana jest argumentowi acct_no, zmienna amnt argumentowi amount.
Notacja nazewnicza
Przy tej notacji nie jest istotna kolejność argumentów w wywołaniu i definicji, ponieważ w wywołaniu jasno określamy jakiemu argumentowi definicji przypisujemy dany argument wywołania.
Przykład definicji procedury
procedure credit (acct_no INTEGER, amount REAL) IS ...
Wywołanie:
credit (acct_no=>acct, amount=>amnt);
Wywołanie:
credit (amount=>amnt, acct_no=>acct,);
W powyższym przykładzie widzimy iż nie jest istotna przy wywołaniu kolejność argumentów w procedurze i równie dobrze możemy argumenty w wywołaniu podać w odwrotnej kolejności znając wyłącznie nazwy argumentów z definicji procedury.
Wartości domyślne argumentów podprogramu
Wartości domyślne argumentów podprogramu pozwala nam określić wartość danego argumentu, w przypadku, gdy spodziewamy się, że dana wartość będzie bardzo często podawana w wywołaniu. W takim przypadku, jeśli nie podamy argumentu w wywołaniu, zostanie mu przypisana wartość domyślna. W przypadku, kiedy w definicji podprogramu istnieją równocześnie argumenty z wartościami domyślnymi. jak również i bez nich, najlepiej wtedy stosować notację przez nazwę.
Przykład deklaracja procedury
procedure create_dept (dep_name VARCHAR2 DEFAULT 'nazwa', new_loc VARCHAR2 DEFAULT 'lokal') IS ...
Możliwe wywołania:
- create_dept;obu argumentom zostanie przypisana wartość domyślna
- create_dept('NAME');pierwszemu argumentowi zostanie przypisana wartość 'NAME'
- create_dept(new_loc=>'LOC');argumentowi o nazwie new_loc zostanie przypisana wartość 'LOC'
Komentarze
Dodaj Komentarz
Newsletter
Jeżeli chcesz być na bieżąco informowany o aktualnościach i poradach IT zapisz się do naszego newslettera.