User Tools

Site Tools


kurs:plsql_tables
PLSQL Table übergeben
--------------------------------------------------------
--  DDL for Package PCK_EMPLOYEES
--------------------------------------------------------

  CREATE OR REPLACE PACKAGE "HR"."PCK_EMPLOYEES" AS 

cursor c_emp_dep(cp_department_name varchar2) is
  select employee_id,
         first_name,
         last_name,
         salary,
         department_name
    from employees e join departments d
      on e.department_id = d.department_id
      where department_name = cp_department_name;
      
type type_emp_dep is table of c_emp_dep%rowtype
  index by binary_integer;     

procedure get_emp_per_dep_name(
  p_department_name in departments.department_name%type,
  t_emp_dep out type_emp_dep);

procedure print_emp_dep(t_emp_dep in type_emp_dep);
/* 
procedure get_emp_per_dep_name (p_department_name in
type_emp_dep out von einem zu definierenden table type

procedure print_emp_dep(type_emp_dep in)
)



*/

procedure next_emp;

END PCK_EMPLOYEES;

/

10 zufällige, nicht doppelte Employees ziehen

CREATE OR REPLACE PROCEDURE PLSQL_TABLE AS 
type type_emp is table of employees%rowtype
  -- index by varchar2(100);
index by binary_integer;

cursor c_emp is select * from employees 
   order by salary desc;

t_emp      type_emp;
t_emp_bulk type_emp;
-- v_index   varchar2(100);
v_index    binary_integer;
v_ind_rand binary_integer;
v_c        number := 0;
BEGIN  
  
  for r_emp in c_emp loop 
    -- t_emp(r_emp.first_name||' '||r_emp.last_name) 
    t_emp(r_emp.employee_id) 
       := r_emp;
  end loop;    
  
  open c_emp;
  fetch c_emp bulk collect into t_emp_bulk;
  close c_emp;

  -- 
  while v_c < 10 loop
    v_ind_rand := trunc(dbms_random.value *
                        t_emp_bulk.count);
    if t_emp_bulk.exists(v_ind_rand) then 
      dbms_output.put_line(v_ind_rand||' '||
                t_emp_bulk(v_ind_rand).first_name);
      v_c := v_c + 1;                
    end if;
  end loop;    

  dbms_output.put_line('2te möglichkeit');
  
  v_index := t_emp.first;
  dbms_output.put_line(t_emp.count);
  /* t_emp.delete(209);
  dbms_output.put_line(t_emp.count);
  while v_index is not null loop
    dbms_output.put_line(v_index||' '||
                        t_emp(v_index).first_name);
    v_index := t_emp.next(v_index);
  end loop;        
  */  
  
  for j in 1..10 loop
    v_ind_rand := trunc(dbms_random.value*t_emp.count);
    v_index := t_emp.first;
    for i in 1..v_ind_rand loop
      v_index := t_emp.next(v_index);
    end loop;
    dbms_output.put_line(v_index||' '||
                        t_emp(v_index).first_name);
    t_emp.delete(v_index);
  end loop;
  
END PLSQL_TABLE;

add & delete education

CREATE OR REPLACE PROCEDURE ADD_EDUCATION 
(
  P_PER_NAME IN VARCHAR2  
, P_NEW_EDUCATION IN VARCHAR2  
) AS 
  v_edu education := education();
  v_index number;
  v_add_edu education := education(P_new_EDUCATION);
BEGIN
  select coalesce(per_education, education()) into v_edu
    from persons where per_name = p_per_name;
  
  /*
  v_edu.extend;
  v_edu(v_edu.last) := p_new_education;
  */
  
  v_edu := v_edu multiset union all v_add_edu;
  
  update persons set per_education = v_edu
    where per_name = p_per_name;
  
  
END ADD_EDUCATION;

 /*v_edu.extend;
  v_edu(v_edu.last) := 'test1';
  
  v_edu.extend;
  v_edu(v_edu.last) := 'test2';
  
  v_edu.extend;
  v_edu(v_edu.last) := 'test3';
  
  
  dbms_output.put_line(v_edu.first||' '|| v_edu.last);
  
  for i in v_edu.first .. v_edu.last loop
    dbms_output.put_line(i||' '|| v_edu(i));
  end loop;
  
  v_index := v_edu.first;
  loop
    dbms_output.put_line(v_index||' '|| v_edu(v_index));
    v_index := v_edu.next(v_index);
    exit when v_index is null;
  end loop;
  */
CREATE OR REPLACE PROCEDURE DELETE_EDUCATION 
(
  P_PER_NAME IN VARCHAR2  
, P_DEL_EDUCATION IN VARCHAR2  
) AS 
  v_edu education := education();
  v_index number;
  v_del_edu education := education(P_DEL_EDUCATION);
BEGIN
  select coalesce(per_education, education()) into v_edu
    from persons where per_name = p_per_name;
  
  /* v_index := v_edu.first;
  loop
    dbms_output.put_line(v_index||' '|| v_edu(v_index));
    if  v_edu(v_index) = P_DEL_EDUCATION then
      v_edu.delete(v_index);
    end if;
    v_index := v_edu.next(v_index);
    exit when v_index is null;
  end loop;
  */
  v_edu := v_edu multiset except v_del_edu;
  
   update persons set per_education = v_edu
    where per_name = p_per_name;
  
END DELETE_EDUCATION;
kurs/plsql_tables.txt · Last modified: 2015/04/09 15:38 by mh