Oracle PL/SQL Tutorial/Function Procedure Packages/Nested Functions

Материал из SQL эксперт
Перейти к: навигация, поиск

Define inner function to calculate age

   <source lang="sql">

SQL> set serveroutput on SQL> set echo on SQL> declare

 2    age   binary_integer;
 3
 4    birth_date    date;
 5    current_date  date;
 6
 7    function age_as_of (birth_date in date, as_of_date in date) return positive is
 8        as_of_year  natural;    --a year of 00 is valid.
 9        as_of_month positive;
10        as_of_day   positive;
11
12        birth_year    natural;  --a year of 00 is valid.
13        birth_month   positive;
14        birth_day     positive;
15
16      age   positive;
17    begin
18        as_of_year := to_number(to_char(as_of_date,"yyyy"));
19        as_of_month := to_number(to_char(as_of_date,"mm"));
20        as_of_day := to_number(to_char(as_of_date,"dd"));
21
22        birth_year := to_number(to_char(birth_date,"yyyy"));
23        birth_month := to_number(to_char(birth_date,"mm"));
24        birth_day := to_number(to_char(birth_date,"dd"));
25
26        if as_of_month > birth_month then
27           age := as_of_year - birth_year;
28        elsif (as_of_month = birth_month) and (as_of_day >= birth_day) then
29           age := as_of_year - birth_year;
30        else
31           age := as_of_year - birth_year - 1;
32        end if;
33
34        return age;
35    end;
36  begin
37
38    current_date := to_date("11-13-1997","mm-dd-yyyy");
39    birth_date   := to_date("11-15-1961","mm-dd-yyyy");
40
41
42    age := age_as_of (birth_date, current_date);
43    dbms_output.put_line(age);
44
45  end;
46  /

35 PL/SQL procedure successfully completed. SQL> SQL></source>


Nested function in anonymous block

   <source lang="sql">

SQL> set echo on SQL> set serveroutput on SQL> SQL> declare

 2
 3     function myFunction (myValue in number,myFactor in number) return number is
 4
 5         myFactor_to_use  number;
 6         minimum_wage  number := 5;
 7     begin
 8         if (myFactor is null) or (myFactor < minimum_wage) then
 9             myFactor_to_use := minimum_wage;
10         else
11             myFactor_to_use := myFactor;
12         end if;
13
14         return myValue * myFactor_to_use;
15      end;
16  begin
17    dbms_output.put_line(myFunction(40,10));
18    dbms_output.put_line(myFunction(40,2));
19    dbms_output.put_line(myFunction(40,null));
20  end;
21  /

400 200 200 PL/SQL procedure successfully completed. SQL> SQL></source>