--
定义获取部门
ID
的函数
create or replace function Get_Dept_Id(in_Dept_name in varchar2) return integer
as
v_dept_id integer := 1;
begin
sELECT dept_id into v_dept_id FROM dict_depts WHERE DEPT_NAME = in_Dept_name;
return v_dept_id;
exception
when no_data_found then
v_dept_id := 1;
return v_dept_id;
when others then
v_dept_id := 1200; -- 糯扎渡项目部将返回 2 条记录 , 在此处捕获并重新赋值
return v_dept_id;
end Get_Dept_Id;
-- 定义获取单位 ID 的函数
create or replace function Get_Unit_Id(in_unit_name in varchar2) return integer
as
v_unit_id integer := 1;
begin
SELECT id into v_unit_id FROM ins_unit_dict WHERE NAME = in_unit_name;
return v_unit_id;
exception
when no_data_found then
v_unit_id := 1;
return v_unit_id;
end Get_Unit_Id;
create or replace function Get_Dept_Id(in_Dept_name in varchar2) return integer
as
v_dept_id integer := 1;
begin
sELECT dept_id into v_dept_id FROM dict_depts WHERE DEPT_NAME = in_Dept_name;
return v_dept_id;
exception
when no_data_found then
v_dept_id := 1;
return v_dept_id;
when others then
v_dept_id := 1200; -- 糯扎渡项目部将返回 2 条记录 , 在此处捕获并重新赋值
return v_dept_id;
end Get_Dept_Id;
-- 定义获取单位 ID 的函数
create or replace function Get_Unit_Id(in_unit_name in varchar2) return integer
as
v_unit_id integer := 1;
begin
SELECT id into v_unit_id FROM ins_unit_dict WHERE NAME = in_unit_name;
return v_unit_id;
exception
when no_data_found then
v_unit_id := 1;
return v_unit_id;
end Get_Unit_Id;
--
存储过程定义代码
/* 调用注意事项 :
目标表的数据列的数据类型必须符合下述规定 :
设备名称 varchar2;
规格型号 varchar2;
原值 number(22,4)/ varchar2;
静值 number(22,4)/ varchar2;
使用单位 varchar2/ varchar2;
分类 varchar2;
单位 varchar2;
*/
/*
参数说明 :
in_math_type: 机具类型
in_OWNER_NAME : 产权单位
in_Self_Code_pre: 自编号前缀
*/
create or replace procedure sub_mach_trans(in_math_type in integer,in_OWNER_NAME in varchar2,in_Self_Code_pre in varchar2) is
type t_target_Data IS REF CURSOR; -- 目标数据类型
v_CursorVar t_target_Data; -- 定义类型游标
-- 可以从目标表中获取的变量
v_MACH_NAME 项目部机具 . 设备名称 %TYPE; -- 机具名称 ;
v_MACH_SPEC 项目部机具 . 规格型号 %TYPE; -- 规格型号 ;
v_ORIGINAL_VALUE 项目部机具 . 原值 %TYPE; -- 机具原值
v_CUR_VALUE 项目部机具 . 净值 %TYPE; -- 机具净值
v_CUR_USED_DEPTID_name 项目部机具 . 使用单位 %TYPE;-- 使用单位名称
v_VALUE_TYPE 项目部机具 . 分类 %TYPE; -- 机具价值分类
v_MACH_UNIT_NAME 项目部机具 . 单位 %TYPE; -- 计量单位名称
v_ID 项目部机具 . 序号 %TYPE; -- 序号
v_COMMENTS 项目部机具 . 备注 %TYPE; -- 备注信息
/* 调用注意事项 :
目标表的数据列的数据类型必须符合下述规定 :
设备名称 varchar2;
规格型号 varchar2;
原值 number(22,4)/ varchar2;
静值 number(22,4)/ varchar2;
使用单位 varchar2/ varchar2;
分类 varchar2;
单位 varchar2;
*/
/*
参数说明 :
in_math_type: 机具类型
in_OWNER_NAME : 产权单位
in_Self_Code_pre: 自编号前缀
*/
create or replace procedure sub_mach_trans(in_math_type in integer,in_OWNER_NAME in varchar2,in_Self_Code_pre in varchar2) is
type t_target_Data IS REF CURSOR; -- 目标数据类型
v_CursorVar t_target_Data; -- 定义类型游标
-- 可以从目标表中获取的变量
v_MACH_NAME 项目部机具 . 设备名称 %TYPE; -- 机具名称 ;
v_MACH_SPEC 项目部机具 . 规格型号 %TYPE; -- 规格型号 ;
v_ORIGINAL_VALUE 项目部机具 . 原值 %TYPE; -- 机具原值
v_CUR_VALUE 项目部机具 . 净值 %TYPE; -- 机具净值
v_CUR_USED_DEPTID_name 项目部机具 . 使用单位 %TYPE;-- 使用单位名称
v_VALUE_TYPE 项目部机具 . 分类 %TYPE; -- 机具价值分类
v_MACH_UNIT_NAME 项目部机具 . 单位 %TYPE; -- 计量单位名称
v_ID 项目部机具 . 序号 %TYPE; -- 序号
v_COMMENTS 项目部机具 . 备注 %TYPE; -- 备注信息
v_AMORTISE_PRICE
项目部机具
.
十月摊销
%TYPE; --
摊销单价
-- 需要计算或定义的变量
v_CUR_USED_DEPTID integer; -- 使用部门编号
v_MACH_UNIT integer ; -- 计量单位编号
v_MACH_BASE_TYPE integer := 2; -- 基础设备类型
v_SELF_CODE varchar2(50) := ''; -- 自编号
v_CUR_STATE integer; -- 当前状态
-- 需要计算或定义的变量
v_CUR_USED_DEPTID integer; -- 使用部门编号
v_MACH_UNIT integer ; -- 计量单位编号
v_MACH_BASE_TYPE integer := 2; -- 基础设备类型
v_SELF_CODE varchar2(50) := ''; -- 自编号
v_CUR_STATE integer; -- 当前状态
v_Value_Type_num integer := 0; --
价值分类数值表述变量
v_Record_cur_index integer; -- 当前记录 Id
v_HANDOVER_Counter integer := 1;-- 领用记录计数器
-- 系统调试用变量
S_Process_Counter integer := 0;
-- 系统异常对象
SYS_DEBUG_EXC EXCEPTION;
v_ErrorCode NUMBER; -- 出错的代码
v_ErrorMsg VARCHAR2(200); -- 错误的消息显示
v_CurrentUser VARCHAR2(8); -- 当前数据库用户
v_Information VARCHAR2(100); -- 关于错误的信息
begin
-- 读取数据
OPEN v_CursorVar FOR
SELECT 设备名称 , 规格型号 , 原值 , 净值 , 使用单位 , 分类 , 单位 , 序号 , 备注 , 十月摊销 FROM 项目部机具 order by 序号 ;
v_Record_cur_index integer; -- 当前记录 Id
v_HANDOVER_Counter integer := 1;-- 领用记录计数器
-- 系统调试用变量
S_Process_Counter integer := 0;
-- 系统异常对象
SYS_DEBUG_EXC EXCEPTION;
v_ErrorCode NUMBER; -- 出错的代码
v_ErrorMsg VARCHAR2(200); -- 错误的消息显示
v_CurrentUser VARCHAR2(8); -- 当前数据库用户
v_Information VARCHAR2(100); -- 关于错误的信息
begin
-- 读取数据
OPEN v_CursorVar FOR
SELECT 设备名称 , 规格型号 , 原值 , 净值 , 使用单位 , 分类 , 单位 , 序号 , 备注 , 十月摊销 FROM 项目部机具 order by 序号 ;
--
遍历数据
LOOP
-- 从游标中提取记录值赋予制定变量
FETCH v_CursorVar INTO v_MACH_NAME, v_MACH_SPEC,v_ORIGINAL_VALUE,v_CUR_VALUE,v_CUR_USED_DEPTID_name,v_VALUE_TYPE,v_MACH_UNIT_NAME,v_Id,v_COMMENTS,v_AMORTISE_PRICE;
-- 退出条件
EXIT WHEN v_CursorVar %NOTFOUND;
-- 工作代码
-- 使用部门编号
v_CUR_USED_DEPTID := Get_Dept_Id(v_CUR_USED_DEPTID_name);
-- 计量单位编号
v_MACH_UNIT := Get_Unit_Id(v_MACH_UNIT_NAME);
-- 自编号
v_SELF_CODE := in_Self_Code_pre||to_char(v_Id);
-- 当前状态
if v_CUR_USED_DEPTID = 1 then
v_CUR_STATE := 0;
else
v_CUR_STATE := 1;
end if;
-- 价值分类
if v_VALUE_TYPE = 'A' then
v_Value_Type_num := 1;
ELSIF v_VALUE_TYPE = 'B' then
v_Value_Type_num:= 2;
ELSIF v_VALUE_TYPE = 'C' then
v_Value_Type_num := 3;
ELSIF v_VALUE_TYPE = 'D' then
v_Value_Type_num := 4;
else
v_Value_Type_num := 0;
end if;
-- 执行复制到 mach_basic_info 表
insert into mach_basic_info
(
id,
MACH_NAME ,
MACH_TYPE ,
MACH_SPEC ,
OWNER_NAME,
ORIGINAL_VALUE ,
CUR_VALUE,CUR_STATE ,
CUR_USED_DEPTID ,
VALUE_TYPE ,
MACH_UNIT ,
MACH_UNIT_NAME ,
MACH_BASE_TYPE,
comments,
self_code
)
values
(
seq_mach_basic_info.nextval,
v_MACH_NAME ,
in_math_type ,
v_MACH_SPEC ,
in_OWNER_NAME ,
CAST(v_ORIGINAL_VALUE AS number(22,4)) ,
CAST(v_CUR_VALUE AS number(22,4)),
v_CUR_STATE ,v_CUR_USED_DEPTID ,
v_Value_Type_num ,
v_MACH_UNIT ,
v_MACH_UNIT_NAME ,
v_MACH_BASE_TYPE,
v_COMMENTS,
v_SELF_CODE
);
-- 记录当前记录 id
select max(id) into v_Record_cur_index from mach_basic_info;
-- 插入记录到 MACH_AMOR_ATTACH_INFO 表 : 摊销价格表
insert into MACH_AMOR_ATTACH_INFO
(
id,
MACH_ID,
AMORTISE_PRICE,
COMMENTS
)
values
(
seq_MACH_AMOR_ATTACH_INFO.Nextval,
v_Record_cur_index,
cast( v_AMORTISE_PRICE AS number(22,6)),
'2006-11-18, 程序自动导入 , 凭据 :10 月摊销金额 '
);
-- 插入记录到 MACH_HANDOVER_RECORD 表 : 领用记录表
if v_CUR_STATE = 1 then
insert into MACH_HANDOVER_RECORD
(
id,
MACH_ID, -- 设备序号
ORDER_CODE, -- 交接单号
HANDOVER_DATE, -- 交接日期
HANDOVER_SPAN_CODE, -- 交接日期所在财务月
FROM_DEPTID, -- 移交单位
TO_DEPTID, -- 接收单位
HANDOVER_STATE, -- 交接单状态(枚举 0 :未交接 1 :已交接 2 :已退库)
AMORTISE_MONEY, -- 摊销单价(若为空自动从台帐中读取)
COMMENTS
)
values
(
seq_MACH_HANDOVER_RECORD.Nextval,
v_Record_cur_index,
' 领 _2006_10_'||to_char(v_HANDOVER_Counter),
to_date('2006-10-01','yyyy-mm-dd'),
'200610C',
1,
v_CUR_USED_DEPTID,
1,
cast( v_AMORTISE_PRICE AS number(22,6)),
'2006-11-18, 程序自动导入 , 凭据 :10 月摊销金额 '
);
-- 计数器加 1
v_HANDOVER_Counter := v_HANDOVER_Counter + 1;
end if;
-- 输出信息
dbms_output.put_line(' 当前完成 :'|| v_MACH_NAME );
S_Process_Counter := S_Process_Counter + 1;
dbms_output.put_line(' 累计完成 :' || to_char(S_Process_Counter));
-- 调试异常
/*
if S_Process_Counter = 2 then
Raise SYS_DEBUG_EXC;
end if;
*/
END LOOP;
-- 关闭游标
CLOSE v_CursorVar ;
-- 提交事务
commit;
-- 异常处理
exception
-- 自定义异常
when SYS_DEBUG_EXC then
-- 关闭游标
CLOSE v_CursorVar ;
dbms_output.put_line(' 异常调试 , 自动回滚 ');
-- 回滚事务
rollback;
-- 其他异常
when others then
-- 关闭游标
CLOSE v_CursorVar ;
v_ErrorCode := SQLCODE;
v_ErrorMsg := SQLERRM;
v_CurrentUser := USER;
v_Information := ' 遇到了错误 ' || TO_CHAR(SYSDATE) || ' 数据库用户 ' || v_CurrentUser;
dbms_output.put_line(' 执行错误 , 自动回滚 ');
dbms_output.put_line(' 详细信息 :'||' 错误代码 :'||v_ErrorCode||', 错误消息 :'||v_ErrorMsg||', 日志信息 :'||v_Information);
-- 回滚事务
rollback;
end sub_mach_trans;
-- 从游标中提取记录值赋予制定变量
FETCH v_CursorVar INTO v_MACH_NAME, v_MACH_SPEC,v_ORIGINAL_VALUE,v_CUR_VALUE,v_CUR_USED_DEPTID_name,v_VALUE_TYPE,v_MACH_UNIT_NAME,v_Id,v_COMMENTS,v_AMORTISE_PRICE;
-- 退出条件
EXIT WHEN v_CursorVar %NOTFOUND;
-- 工作代码
-- 使用部门编号
v_CUR_USED_DEPTID := Get_Dept_Id(v_CUR_USED_DEPTID_name);
-- 计量单位编号
v_MACH_UNIT := Get_Unit_Id(v_MACH_UNIT_NAME);
-- 自编号
v_SELF_CODE := in_Self_Code_pre||to_char(v_Id);
-- 当前状态
if v_CUR_USED_DEPTID = 1 then
v_CUR_STATE := 0;
else
v_CUR_STATE := 1;
end if;
-- 价值分类
if v_VALUE_TYPE = 'A' then
v_Value_Type_num := 1;
ELSIF v_VALUE_TYPE = 'B' then
v_Value_Type_num:= 2;
ELSIF v_VALUE_TYPE = 'C' then
v_Value_Type_num := 3;
ELSIF v_VALUE_TYPE = 'D' then
v_Value_Type_num := 4;
else
v_Value_Type_num := 0;
end if;
-- 执行复制到 mach_basic_info 表
insert into mach_basic_info
(
id,
MACH_NAME ,
MACH_TYPE ,
MACH_SPEC ,
OWNER_NAME,
ORIGINAL_VALUE ,
CUR_VALUE,CUR_STATE ,
CUR_USED_DEPTID ,
VALUE_TYPE ,
MACH_UNIT ,
MACH_UNIT_NAME ,
MACH_BASE_TYPE,
comments,
self_code
)
values
(
seq_mach_basic_info.nextval,
v_MACH_NAME ,
in_math_type ,
v_MACH_SPEC ,
in_OWNER_NAME ,
CAST(v_ORIGINAL_VALUE AS number(22,4)) ,
CAST(v_CUR_VALUE AS number(22,4)),
v_CUR_STATE ,v_CUR_USED_DEPTID ,
v_Value_Type_num ,
v_MACH_UNIT ,
v_MACH_UNIT_NAME ,
v_MACH_BASE_TYPE,
v_COMMENTS,
v_SELF_CODE
);
-- 记录当前记录 id
select max(id) into v_Record_cur_index from mach_basic_info;
-- 插入记录到 MACH_AMOR_ATTACH_INFO 表 : 摊销价格表
insert into MACH_AMOR_ATTACH_INFO
(
id,
MACH_ID,
AMORTISE_PRICE,
COMMENTS
)
values
(
seq_MACH_AMOR_ATTACH_INFO.Nextval,
v_Record_cur_index,
cast( v_AMORTISE_PRICE AS number(22,6)),
'2006-11-18, 程序自动导入 , 凭据 :10 月摊销金额 '
);
-- 插入记录到 MACH_HANDOVER_RECORD 表 : 领用记录表
if v_CUR_STATE = 1 then
insert into MACH_HANDOVER_RECORD
(
id,
MACH_ID, -- 设备序号
ORDER_CODE, -- 交接单号
HANDOVER_DATE, -- 交接日期
HANDOVER_SPAN_CODE, -- 交接日期所在财务月
FROM_DEPTID, -- 移交单位
TO_DEPTID, -- 接收单位
HANDOVER_STATE, -- 交接单状态(枚举 0 :未交接 1 :已交接 2 :已退库)
AMORTISE_MONEY, -- 摊销单价(若为空自动从台帐中读取)
COMMENTS
)
values
(
seq_MACH_HANDOVER_RECORD.Nextval,
v_Record_cur_index,
' 领 _2006_10_'||to_char(v_HANDOVER_Counter),
to_date('2006-10-01','yyyy-mm-dd'),
'200610C',
1,
v_CUR_USED_DEPTID,
1,
cast( v_AMORTISE_PRICE AS number(22,6)),
'2006-11-18, 程序自动导入 , 凭据 :10 月摊销金额 '
);
-- 计数器加 1
v_HANDOVER_Counter := v_HANDOVER_Counter + 1;
end if;
-- 输出信息
dbms_output.put_line(' 当前完成 :'|| v_MACH_NAME );
S_Process_Counter := S_Process_Counter + 1;
dbms_output.put_line(' 累计完成 :' || to_char(S_Process_Counter));
-- 调试异常
/*
if S_Process_Counter = 2 then
Raise SYS_DEBUG_EXC;
end if;
*/
END LOOP;
-- 关闭游标
CLOSE v_CursorVar ;
-- 提交事务
commit;
-- 异常处理
exception
-- 自定义异常
when SYS_DEBUG_EXC then
-- 关闭游标
CLOSE v_CursorVar ;
dbms_output.put_line(' 异常调试 , 自动回滚 ');
-- 回滚事务
rollback;
-- 其他异常
when others then
-- 关闭游标
CLOSE v_CursorVar ;
v_ErrorCode := SQLCODE;
v_ErrorMsg := SQLERRM;
v_CurrentUser := USER;
v_Information := ' 遇到了错误 ' || TO_CHAR(SYSDATE) || ' 数据库用户 ' || v_CurrentUser;
dbms_output.put_line(' 执行错误 , 自动回滚 ');
dbms_output.put_line(' 详细信息 :'||' 错误代码 :'||v_ErrorCode||', 错误消息 :'||v_ErrorMsg||', 日志信息 :'||v_Information);
-- 回滚事务
rollback;
end sub_mach_trans;