摘 要:本文通過社會保險網(wǎng)上公共服務管理系統(tǒng)的開發(fā),實現(xiàn)了利用oracle數(shù)據(jù)庫中存儲過程來實現(xiàn)不同參保單位補繳不同年份的養(yǎng)老保險金的利息計算問題,從而簡化了該功能的計算過程,提高了數(shù)據(jù)處理速度,減少了網(wǎng)絡通信流量,提高了系統(tǒng)的執(zhí)行效率。
關鍵詞:oracle數(shù)據(jù)庫;存儲過程;養(yǎng)老保險金;計算利息
中圖分類號:TP311.138
基于oracle數(shù)據(jù)庫平臺的社會保險網(wǎng)上公共服務管理系統(tǒng)的設計目標,是為了進一步完善現(xiàn)有社保業(yè)務管理服務社會化的要求,提高社保部門的服務水平,提高工作效率,減少用人單位的工作量,降低各項錯誤數(shù)據(jù)的產生,逐步實現(xiàn)參保單位辦理社保業(yè)務的標準化、規(guī)范化?;谠撃繕?,在系統(tǒng)開發(fā)過程中涉及計算不同參保單位補繳不同年份的養(yǎng)老保險金的利息計算問題模塊,該問題涉及眾多的參保單位,計算不同年份的利息,計算過程繁瑣,根據(jù)存儲過程的執(zhí)行特點和優(yōu)點,將該模塊使用存儲過程來實現(xiàn),簡化了該計算過程,體現(xiàn)了模塊化程序設計的思想。
1 存儲過程概述
1.1 存儲過程概念。存儲過程(Stored Procedure)是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的SQL 語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。Oracle 中的存儲過程是sql、pl/sql、java語句的組合,使用存儲過程可以將執(zhí)行商業(yè)規(guī)則的代碼從應用程序轉移到數(shù)據(jù)庫中,從而使相應的代碼存儲一次就可以被多個程序多次調用。
1.2 存儲過程的優(yōu)點
(1)存儲過程只在創(chuàng)造時進行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。
(2)當對數(shù)據(jù)庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此復雜操作用存儲過程封裝起來與數(shù)據(jù)庫提供的事務處理結合一起使用。
(3)存儲過程可以重復使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量。
(4)安全性高,可設定只有某用戶才具有對指定存儲過程的使用權。
(5)減少網(wǎng)絡傳輸:特別是對于一些處理數(shù)據(jù)的存儲過程,不必像直接使用SQL語句那樣多次傳送數(shù)據(jù)到客戶端。
(6)可維護性高:更新存儲過程通常要比更改、測試和部署應用程序需要的時間和精力要少。
1.3 使用存儲過程的策略
(1)當一個事務涉及到多個SQL語句或者涉及到多個表的操作時,應該考慮使用存儲過程。(2)當一個事務的完成需要很復雜的商業(yè)邏輯時,考慮使用存儲過程。(3)當要處理比較復雜的計算、統(tǒng)計、匯總操作時,考慮使用存儲過程。
2 社會保險網(wǎng)上公共服務管理系統(tǒng)利息結算分析
根據(jù)豫人社養(yǎng)老[2010]11號文件的規(guī)定,在未參保人員和漏保人員參保時,需要補繳基本養(yǎng)老保險費本金和利息。由于涉及眾多的參保單位,用戶個人賬戶的利息計算以1998繳費年度為分界點,過程繁瑣,下面給出該過程的計算方法:
(1)1998年度之前個人帳戶的計息:上年度帳戶儲存額存滿一年計全息,當年度繳費計半息。年度計息公式:累計金額本年度=累計金額上年度×(1+年利率本年度)+當年金額×(1+年利率本年度/2)
(2)1998年度之后(含1998年度)個人帳戶的計息:資金在帳戶中存滿全年按年利率計算,當年繳費按照其在帳戶中存續(xù)的月份數(shù)乘以年利率的1/12結算;年度計息公式:累計金額本年度=累計金額上年度×(1+年收益率本年度)+∑當年各月金額×(1+存續(xù)月數(shù)×年收益率/12本年度)
通過以上的介紹可以看出,如果不采用存儲過程來開發(fā),不同單位、不同年份都要重復相同的代碼,程序開發(fā)人員的工作量很大,且效率很低,維護起來也很麻煩,該過程正好符合使用存儲過程解決問題的策略,因此在該系統(tǒng)中使用存儲過程來實現(xiàn)利息的計算問題。
3 使用存儲過程進行利息計算具體實現(xiàn)
由于該存儲過程代碼量比較大,所以在該文中略去了定義變量部分及異常處理部分,只寫出了主要的計息過程。參數(shù)介紹:輸入?yún)?shù)為:單位代碼、應繳費年月、繳費金額,返回值為:錯誤代碼、應繳利息。
CREATE OR REPLACE procedure ztj_jslx(lsdwdm IN VARCHAR2 ,lsyjny IN VARCHAR2 ,ldje IN Number , v_return out varchar2 ,ldyjlx out NUMBER ) is
--定義變量
…
--循環(huán)取出繳費年度、工作年度的起始年月、結束年月和歷年的利率
cursor cc IS select jf_nd lsjfnd1, min(qssj) lsqssj1 , max(jzsj) lsjzsj1 ,Max(Nvl(ll,0)) ldll1 from zjfa WHERE dw_dm= lsdwdm AND jf_nd > lsjfnd GROUP BY jf_nd ORDER BY jf_nd;
begin
SELECT csz INTO lsgzny FROM xtlccs WHERE dm='300'; 取出當前工作年度和年月
SELECT jf_nd INTO lsjfnd FROM zjfa WHERE dw_dm=trim(lsdwdm) AND qssj<=trim(lsyjny) AND jzsj>=trim(lsyjny);
SELECT Max(jzsj),Max(Nvl(ll,0)) INTO lsjzsj , ldll FROM zjfa WHERE dw_dm=trim(lsdwdm) AND jf_nd=lsjfnd;
IF lsjfnd <'1998' THEN
ldlx := ldje * ldll /200; 1998年前記半息
ELSIF lsjfnd <> lsgznd THEN
ldlx := ldje * ldll * getmonth(lsyjny,lsjzsj)/1200 ; 1998年后按月記息
ELSE --補繳當年的利息計算
ldlx := ldje * ldll * getmonth(lsyjny,lsgzny)/1200 ;
END IF;--循環(huán)計算到當前年度
for dd in cc LOOP
IF dd.lsjfnd1<> lsgznd THEN
ldlx := ldlx + (ldje + ldlx ) * dd.ldll1 /100 ;
ELSE
ldlx := ldlx + (ldje + ldlx ) * dd.ldll1 * getmonth(dd.lsqssj1,lsgzny)/1200;
END IF ; END LOOP;ldyjlx := ldlx ;--異常處理
… END ztj_jslx ;
4 結束語
社會保險網(wǎng)上公共服務管理系統(tǒng)中,涉及到很多比較復雜的計算及處理過程,這些過程均采用oracle的存儲過程來實現(xiàn)。通過實際應用表明,存儲過程的使用降低系統(tǒng)的開發(fā)難度,減少了開發(fā)人員的工作量,提高的系統(tǒng)的執(zhí)行效率。
參考文獻:
[1]河南省人力資源和社會保障廳辦公室[Z].豫人社養(yǎng)老[2010]11號,2010(07).
[2]李晶,李星,劉剛.基于Oracle存儲過程與觸發(fā)器的三維空間數(shù)據(jù)日志管理方法[J].計算機與現(xiàn)代化,2010(07).
[3]陳虹.基于Oracle的高校研究生招生系統(tǒng)設計與實現(xiàn)[J].電腦知識與技術,2010(07).
[4]陳永建,朱娟,黎桂林.Java中Oracle存儲過程的使用方法研究[J].哈爾濱商業(yè)大學學報(自然科學版),2005(06).
作者簡介:趙雪琴,女,碩士,講師,主要研究方向:數(shù)據(jù)庫及計算機應用。
作者單位:鄭州大學 西亞斯國際學院,河南新鄭 451150
基金項目:本文系河南省科技廳重點科技攻關項目“社會保險網(wǎng)上服務平臺的研究與實現(xiàn)”(項目編號:132102210415)研究成果。