天天看点

Oracle Cursor游标自身更新

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;

继续阅读