在此仅贴出包的代码方便回顾,完整例子见附件!
create or replace package pkg_dept is
-- Author : YUANHONGBO
-- Created : 2011/11/8 21:15:17
-- Purpose :
/*
*取上级部门id
*
*根据excel导入顺序,取得上一级部门:比当前行号小的第一个一级部门
*/
function get_parent_id(p_busi_id number, p_id number, p_level number)
return number;
/*
*处理部门维护信息
*/
procedure process_department(p_busi_id number, p_level number default 6);
end pkg_dept;
/
create or replace package body pkg_dept is
/*
*记录日志
*/
procedure log(p_sql varchar2) is
begin
dbms_output.put_line(p_sql);
exception
when others then
null;
end;
/*
*取上级部门id
*
*根据excel导入顺序,取得上一级部门:比当前行号小的第一个一级部门
*/
function get_parent_id(p_busi_id number, p_id number, p_level number)
return number is
v_pid number;
c_sql sys_refcursor;
v_sql varchar2(2000);
v_error_code varchar2(200);
v_error_msg varchar2(200);
begin
begin
if p_level = 1 then
v_pid := -1;
else
/*必须使用 order by desc 不能使用rownum*/
v_sql := 'select t.id from hw_ehr_dept_adjust_t t where t.id < ' ||
to_number(p_id) || ' and t.dept_level = ' ||
to_number(p_level - 1) || ' and t.busi_id = ' ||
to_number(p_busi_id) || ' order by t.id desc';
log(v_sql);
open c_sql for v_sql;
/* 取得第一行记录后结束 */
fetch c_sql
into v_pid;
log(v_pid);
if c_sql%isopen then
close c_sql;
end if;
end if;
exception
when others then
v_pid := -999;
v_error_code := sqlcode;
v_error_msg := sqlerrm;
log('v_error_code:' || v_error_code || ' v_error_msg:' ||
v_error_msg);
end;
return v_pid;
end;
/*
*处理部门维护信息
*/
procedure process_department(p_busi_id number, p_level number default 6) is
type record_row is record(
id number,
dept_name varchar2(500),
dept_code varchar2(500),
dept_adjust_name varchar2(500),
opt varchar2(50));
c_sql sys_refcursor;
v_sql varchar2(4000);
v_row record_row;
v_error_code varchar2(200);
v_error_msg varchar2(200);
begin
/*需要添加(p_level+1)级部门,用于最后一级部门修改名称*/
for level_index in 1 .. p_level loop
v_sql := 'select id, l' || to_char(level_index) ||
'_name dept_name, l' || to_char(level_index) ||
'_code dept_code, l' || to_char(level_index + 1) ||
'_name dept_adjust_name , opt from hw_ehr_dept_t_temp t where t.l' ||
to_char(level_index) || '_code is not null order by id';
log(v_sql);
open c_sql for v_sql;
loop
fetch c_sql
into v_row;
exit when c_sql%notfound;
log('name:' || v_row.dept_name);
insert into hw_ehr_dept_adjust_t
(busi_id,
id,
p_id,
dept_name,
dept_code,
dept_level,
opt,
attribute1,
attribute2,
attribute3)
values
(p_busi_id,
v_row.id,
get_parent_id(p_busi_id, v_row.id, level_index),
v_row.dept_name,
v_row.dept_code,
level_index,
v_row.opt,
v_row.dept_adjust_name,
null,
null);
end loop;
if c_sql%isopen then
close c_sql;
end if;
end loop;
commit;
exception
when others then
v_error_code := sqlcode;
v_error_msg := sqlerrm;
log('v_error_code:' || v_error_code || ' v_error_msg:' ||
v_error_msg);
end;
begin
-- initialization
null;
end pkg_dept;
/