Mega Code Archive

 
Categories / Oracle PLSQL Tutorial / PL SQL Programming
 

Inner function

SQL> SQL> create table employee (   2  id                             number,   3  employee_type_id                 number,   4  external_id                    varchar2(30),   5  first_name                     varchar2(30),   6  middle_name                    varchar2(30),   7  last_name                      varchar2(30),   8  name                           varchar2(100),   9  birth_date                     date  ,  10  gender_id                      number ); Table created. SQL> SQL> create table gender (   2  id                             number,   3  code                           varchar2(30),   4  description                    varchar2(80),   5  active_date                    date          default SYSDATE  not null,   6  inactive_date                  date ); Table created. SQL> SQL> insert into gender ( id, code, description ) values ( 1, 'F', 'Female' ); 1 row created. SQL> insert into gender ( id, code, description ) values ( 2, 'M', 'Male' ); 1 row created. SQL> insert into gender ( id, code, description ) values ( 3, 'U', 'Unknown' ); 1 row created. SQL> SQL> create table employee_type (   2  id                             number,   3  code                           varchar2(30),   4  description                    varchar2(80),   5  active_date                    date          default SYSDATE  not null,   6  inactive_date                  date ); Table created. SQL> SQL> insert into employee_type(id,code,description)values(1,'C','Contractor' ); 1 row created. SQL> insert into employee_type(id,code,description)values(2,'E','Employee' ); 1 row created. SQL> insert into employee_type(id,code,description)values(3,'U','Unknown' ); 1 row created. SQL> SQL> set serveroutput on size 1000000; SQL> SQL> declare   2  n_count                               number := 0;   3   4  FUNCTION add_worker(   5  aiv_first_name                        employee.first_name%TYPE,   6  aiv_middle_name                       employee.middle_name%TYPE,   7  aiv_last_name                         employee.last_name%TYPE,   8  aid_birth_date                        employee.birth_date%TYPE,   9  aiv_gender_code                       gender.code%TYPE,  10  aiv_employee_type_code                employee_type.code%TYPE)  11  return                                number is  12  13  v_name                                employee.name%TYPE;  14  15  begin  16    v_name        := rtrim(aiv_last_name||', '||aiv_first_name||' '||aiv_middle_name);  17    begin  18      insert into employee (  19             id,  20             employee_type_id,  21             external_id,  22             first_name,  23             middle_name,  24             last_name,  25             name,  26             birth_date,  27             gender_id )  28      select 1,  29             myCursor.id,  30             lpad(to_char(1), 9, '0'),  31             aiv_first_name,  32             aiv_middle_name,  33             aiv_last_name,  34             v_name,  35             aid_birth_date,  36             c2.id  37      from   employee_type myCursor,  38             gender c2  39      where  myCursor.code = aiv_employee_type_code  40      and    c2.code = aiv_gender_code  41      and not exists (  42        select 1  43        from   employee x  44        where  x.name       = v_name  45        and    x.birth_date = aid_birth_date  46        and    x.gender_id  = c2.id );  47  48      return sql%rowcount;  49    exception  50      when OTHERS then  51        raise_application_error(-20001, SQLERRM||' on insert employee'||' in add_worker');  52    end;  53  end add_worker;  54  55  begin  56    n_count := n_count + add_worker('JOHN',   'J.', 'DOE', to_date('19800101', 'YYYYMMDD'), 'M', 'C');  57    n_count := n_count + add_worker('JANE',   'J.', 'DOE', to_date('19800101', 'YYYYMMDD'), 'F', 'E');  58    n_count := n_count + add_worker('JOHNNY', 'E.', 'DOE', to_date('19980101', 'YYYYMMDD'), 'M', 'E');  59    n_count := n_count + add_worker('JANIE',  'E.', 'DOE', to_date('19980101', 'YYYYMMDD'), 'F', 'E');  60    DBMS_OUTPUT.PUT_LINE(to_char(n_count)||' row(s) inserted.');  61  end;  62  / 4 row(s) inserted. PL/SQL procedure successfully completed. SQL> SQL> drop table gender; Table dropped. SQL> SQL> drop table employee; Table dropped. SQL> SQL> drop table employee_type; Table dropped. SQL>