分享
 
 
 

ORACLE 存储过程实战

王朝oracle·作者佚名  2006-11-20
窄屏简体版  字體: |||超大  

--定义获取部门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; --备注信息

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_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 序号;

--遍历数据

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;

--存储过程调用代码

set serverout on --开启系统输出

execute sub_mach_trans(334 ,'自购' ,'项目部-');

--历史镜像

select max(id) from mach_basic_info t

--检查结果

select * from mach_basic_info where id >3217

请支持本土软件事业,http://itabby.com,开发者工具箱

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有