Home
Services
Oil Distribution
Articles
About Us
Jobs
Contact Us

 

 

 

 

Home > Articles > Benefits of Using Oracle Forms' Stored Procedure Data Blocks > Source Code

PL/SQL Based Forms Blocks

Create or replace package employee_pkg is


  type emp_rec is record
    (emp_id             employee.emp_id%type,
     first_name         employee.first_name%type,
     last_name          employee.last_name%type,
     ssn                employee_confidential.ssn%type,
     salary             employee_confidential.salary%type);


  type emp_tbl is table of emp_rec index by binary_integer;


  -- cursor variable to be used in do_query_cur procedure
  type emp_ref is ref cursor return emp_rec;


  -----------------------------
  procedure do_query(p_emp_table     IN OUT emp_tbl,
                     p_emp_id        IN     employee.emp_id%type);


  -----------------------------
  -- second version of query procedure, this time use cursor variable
  --   instead of PL/SQL table
  procedure do_query_cur(p_emp_set   IN OUT emp_ref,
                         p_emp_id    IN     employee.emp_id%type);


  -----------------------------
  procedure do_insert(p_emp_table    IN OUT emp_tbl);


  -----------------------------
  procedure do_update(p_emp_table    IN OUT emp_tbl);


  -----------------------------
  procedure do_delete(p_emp_table    IN OUT emp_tbl);


  -----------------------------
  -- note that do_lock is needed if the form will need to 
  --   perform update or delete 
  procedure do_lock(p_emp_table      IN OUT emp_tbl);


end employee_pkg;




Create or replace package body employee_pkg is


  procedure do_query(p_emp_table     IN OUT emp_tbl,
                     p_emp_id        IN     employee.emp_id%type) is
    cursor emp_cur (p_id   employee.emp_id%type) is
       select e.emp_id, 
              e.first_name,
              e.last_name,
              c.ssn,
              c.salary
         from employee e,
              employee_confidential c
        where e.emp_id = c.emp_id and
              e.emp_id = p_id;
    idx   number := 1;
  begin
    for rec in emp_cur(p_emp_id) loop

  -- populate a PL/SQL table with a record
      p_emp_table(idx) := rec;      
  -- increment index
      idx              := idx + 1;  
    end loop; 
  end; 


  -----------------------------
  -- second version of query procedure, this time use cursor variable
  --   instead of PL/SQL table
  procedure do_query_cur(p_emp_set   IN OUT emp_ref,
                         p_emp_id    IN     employee.emp_id%type) is
  begin
    open p_emp_set for
       select e.emp_id, 
              e.first_name,
              e.last_name,
              c.ssn,
              c.salary
         from employee e,
              employee_confidential c
        where e.emp_id = c.emp_id and
              e.emp_id = p_emp_id;
  end;

  -----------------------------
  procedure do_insert(p_emp_table    IN OUT emp_tbl) is
    numOfRows   number;
  begin
    numOfRows  := p_emp_table.count;
    for idx in 1 .. numOfRows loop
      insert into employee
        (emp_id,
         first_name,
         last_name) values
        (p_emp_table(idx).emp_id,
         p_emp_table(idx).first_name,
         p_emp_table(idx).last_name);

      insert into employee_confidential
        (emp_id,
         ssn,
         salary) values
        (p_emp_table(idx).emp_id,
         p_emp_table(idx).ssn,
         p_emp_table(idx).salary); 
    end loop;
  end ;

  -----------------------------
  procedure do_update(p_emp_table    IN OUT emp_tbl) is
    numOfRows   number;
  begin
    numOfRows  := p_emp_table.count;
    for idx in 1 .. numOfRows loop
      update employee set
          first_name  = p_emp_table(idx).first_name,
          last_name   = p_emp_table(idx).last_name
        where
          emp_id = p_emp_table(idx).emp_id ;

      update employee_confidential set
          ssn     = p_emp_table(idx).ssn,
          salary  = p_emp_table(idx).salary
        where 
          emp_id = p_emp_table(idx).emp_id; 
    end loop;
  end ;

  -----------------------------
  procedure do_delete(p_emp_table    IN OUT emp_tbl) is
    numOfRows   number;
  begin
    numOfRows  := p_emp_table.count;
    for idx in 1 .. numOfRows loop
      delete employee
        where emp_id = p_emp_table(idx).emp_id ;

      delete employee_confidential
        where emp_id = p_emp_table(idx).emp_id; 
    end loop;
  end ;

  -----------------------------
  -- note that do_lock is needed if the form will need to 
  --   perform update or delete
  procedure do_lock(p_emp_table      IN OUT emp_tbl) is
    numOfRows   number;
    id          employee.emp_id%type;
  begin
    numOfRows  := p_emp_table.count;
    for idx in 1 .. numOfRows loop
      select emp_id
        into id
        from employee
       where emp_id = p_emp_table(idx).emp_id
       for update nowait;

      select emp_id
        into id
        from employee_confidential
       where emp_id = p_emp_table(idx).emp_id
       for update nowait;
    end loop;
  end ;

end employee_pkg;
 
 
 
Copyright© 2000- Summit Software Design, Inc. and its licensors. All Rights Reserved.