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'

powrót
Zachęcam do przedstawienia swoich uwag i opinii w polu komentarzy.

Komentarze

Dodaj Komentarz