天天看點

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;

繼續閱讀