ORACLE 存储过程实战

 
-- 定义获取部门 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;
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值