Oracle Cursor游标自身更新

来源:互联网 发布:迅游网游加速器 mac 编辑:程序博客网 时间:2024/05/01 13:24

Create Or Replace Procedure JXGZ_绩效评分计算
(
  考核期间ID_in In 考核期间.ID%Type,
  登记人ID_in   In 考核数据.操作员ID%Type,
  登记日期_in   In 考核数据.登记日期%Type,
  所属机构_in   In 考核数据.ID%Type
) As
  --定义过程变量
  R_工资详表 绩效工资数据明细%rowtype;
  v_类别         绩效工资管理.类别%Type := 0;
  v_考核期间id   绩效工资管理.考核期间id%Type := 考核期间ID_in;
  v_登记人       绩效工资管理.登记人%Type := 登记人ID_in;
  v_登记日期     绩效工资管理.登记日期%Type := 登记日期_in;
  --定义游标[动态]
  Cursor tablecursor
  (
    v_考核期间ID Varchar2,
    v_所属机构   Varchar
  ) Is
    Select A.工作质量分数, A.工作数量分数, A.行政管理分数, A.绩效总分, A.当前总分
    From 绩效工资数据明细 A
    Where A.考核期间ID = v_考核期间ID And A.机构ID = v_所属机构
    For Update;

Begin
  --新的主表期间ID
  Select NewId() Into v_id From dual;
  Select t.考核期间id Into v_考核期间id From 考核数据 t Where t.考核期间id = 考核期间ID_in And t.所属机构 = 所属机构_in And ROWNUM = 1;
  Insert Into 绩效工资管理 (ID, 类别, 机构id, 考核期间id, 登记人, 登记日期) Values (v_id, v_类别, 所属机构_in, v_考核期间id, v_登记人, v_登记日期);
  --插入数据
  Insert Into 绩效工资数据明细
    (ID, 考核数据ID, 绩效工资管理ID, 部门id, 个人id, 系数, 考核期间id, 工作数量分数, 工作质量分数, 行政管理分数, 机构ID)
    Select NewId(), 考核数据ID, v_id, 所属部门, 机构人员ID, 系数, 考核期间id, Sum(工作数量考核), Sum(工作质量考核), Sum(行政管理考核), 所属机构
    From (Select B.所属部门, B.机构人员ID, B.ID, 考核数据ID, b.系数, b.考核期间id, DECODE(考核类别, '工作数量考核', 分值 * 数量, 0) As 工作数量考核,
                  DECODE(考核类别, '工作质量考核', 分值 * 数量, 0) As 工作质量考核, DECODE(考核类别, '行政管理考核', 分值 * 数量, 0) As 行政管理考核, B.所属机构
           From 考核数据详细 A, 考核数据 B
           Where b.id = a.考核数据id And b.考核期间id = 考核期间ID_in And b.所属机构 = 所属机构_in)
    Group By 所属部门, 机构人员ID, 考核数据id, 系数, 考核期间id, 所属机构;

  --游标计算
  Open tablecursor(考核期间ID_in, 所属机构_in);
  While tablecursor%Found Loop
    If R_工资详表.考核期间ID = 考核期间ID_in And R_工资详表.机构ID = 所属机构_in Then
      Update 绩效工资数据明细
      Set 当前总分 =500
          End)
      Where Current Of tablecursor;
    End If;
  End Loop;
  Close tablecursor;
  Commit;
Exception
  When Others Then
    Null;
End JXGZ_绩效评分计算;

-------------------正式版

Create Table Cur_Table
(
CID Number(10) Primary Key,
CType  Number(1),
CName Varchar2(300),
CResult  Number(20)
)

CREATE OR REPLACE Procedure P_游标UpdateTable
(
  Type_in   In Cur_Table.CType%Type,
  Result_in In Cur_Table.CResult%Type
) As
  Cursor T_Cursor(Type_in Cur_Table.CType%Type) Is
    Select * From Cur_Table Where ctype = Type_in For Update;
  Rs Cur_Table%Rowtype;
Begin
  Open T_Cursor(Type_in);
  Loop
    Fetch T_Cursor Into Rs;
            Exit When T_Cursor%Notfound;
        Update Cur_Table Set CResult = Result_in,CName='大圣' Where Current Of T_Cursor;
  End Loop;
  Commit;
  Close T_Cursor;
End P_游标UpdateTable;

原创粉丝点击