⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proc_rept_acctfee.sql

📁 一个用在电信帐务系统中的oracle的存储过程
💻 SQL
字号:
CREATE OR REPLACE PROCEDURE PROC_REPT_ACCTFEE(out_n_errno OUT NUMBER,
											out_s_errmsg OUT VARCHAR2)
IS

s_acctid		VARCHAR2(14);
n_predeposittypeid	NUMBER(10);
s_sourceid		VARCHAR(6);
n_thisbal		NUMBER(10);
s_areaid		VARCHAR2(8);
s_billingcyclid	VARCHAR2(8);
s_stat			CHAR(1);
s_paysn			VARCHAR2(20);
n_balance		NUMBER;
s_subareaid		VARCHAR2(8);
s_errmsg		VARCHAR2(200);
n_lastfee		NUMBER;
n_thisfee		NUMBER;

n_curcycl		NUMBER(1);
s_curbillingcycl	VARCHAR2(20);
s_prebillingcycl	VARCHAR2(20);
s_cyclid		varchar(20);
s_accttype  VARCHAR2(20);
n_cnt			NUMBER;


CURSOR cur_tab_accountpredeposit IS SELECT acctid, predeposittypeid, sourceid, thisbal, areaid
								FROM tab_accountpredeposit a;

CURSOR cur_tab_accountpredepositdtal IS SELECT acctid, predeposittypeid, paysn, balance
								FROM tab_accountpredepositdtal b
								WHERE b.predeposittypeid = n_predeposittypeid
									AND b.acctid = s_acctid
									AND (recordtype = '02' OR recordtype='04');

BEGIN
	COMMIT;
	out_n_errno := 0;
	n_cnt := 0 ;

	BEGIN
    	DELETE FROM rept_acctfee;
		EXCEPTION
		WHEN OTHERS THEN
			s_errmsg := 'DELETE表rept_acctfee错误: '  || SUBSTR(SQLERRM,1,100);
		    INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, s_errmsg);
		    out_n_errno := 1;
		    out_s_errmsg := s_errmsg;
		    return ;
	END;

	/*取当前帐务周期 */
	BEGIN
		SELECT billingcyclid INTO s_curbillingcycl FROM tab_billingcycl WHERE stat='1';
		EXCEPTION
		WHEN NO_DATA_FOUND THEN
			out_s_errmsg := '没有当前帐务周期';
			INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, out_s_errmsg);
			out_n_errno := 2;
			COMMIT;
			RETURN;

       	WHEN OTHERS THEN
			out_s_errmsg := '取tab_billingcycl表错误:' || SUBSTR(SQLERRM,1,100);
			INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, out_s_errmsg);
			out_n_errno := 2;
			COMMIT;
			RETURN;
	END;


	/*取上一帐务周期 */
	BEGIN
		SELECT max(billingcyclid) INTO s_prebillingcycl FROM tab_billingcycl WHERE billingcyclid<s_curbillingcycl;
		EXCEPTION
		WHEN NO_DATA_FOUND THEN
			out_s_errmsg := '没有上一帐务周期';
			INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, out_s_errmsg);
			out_n_errno := 2;
			COMMIT;
			RETURN;

       	WHEN OTHERS THEN
			out_s_errmsg := '取tab_billingcycl表错误:' || SUBSTR(SQLERRM,1,100);
			INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, out_s_errmsg);
			out_n_errno := 2;
			COMMIT;
			RETURN;
	END;

	n_lastfee := 0;
	n_thisfee := 0;

	FOR C1 IN cur_tab_accountpredeposit LOOP

		n_lastfee := 0;
		n_thisfee := 0;
		FOR C3 IN cur_tab_accountpredepositdtal LOOP
			s_cyclid := '';
			SELECT NVL(billingcyclid, '') INTO s_cyclid FROM tab_billdetail WHERE WRTOFFSN=C3.paysn;

			IF (s_cyclid!='') THEN
				IF (s_cyclid = s_prebillingcycl) THEN
					n_thisfee := n_thisfee + C3.balance;
				ELSIF (s_cyclid < s_prebillingcycl) THEN
					n_lastfee := n_lastfee + C3.balance;
				END IF;
			END IF;
		END LOOP;

		BEGIN
			SELECT standby2 INTO s_subareaid FROM tab_subscrb WHERE subscrbid = C1.acctid;
			EXCEPTION
			WHEN NO_DATA_FOUND THEN
               	s_subareaid :='';
               	out_s_errmsg := '取表tab_subscrb没有相应数据' || C1.acctid;
               	INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, out_s_errmsg);
           		out_n_errno := 3;
           		COMMIT;
           		RETURN;

           	WHEN OTHERS THEN
               	s_subareaid := '';
                	out_s_errmsg := '取表tab_subscrb错误 ' || C1.acctid  || SUBSTR(SQLERRM,1,100);
                	INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, out_s_errmsg);
           		out_n_errno := 3;
           		COMMIT;
           		RETURN;
		END;

		BEGIN
			SELECT accttype INTO s_accttype FROM tab_acct WHERE acctid=C1.acctid;
			EXCEPTION
			WHEN NO_DATA_FOUND THEN
				s_accttype := '';
               	out_s_errmsg := '取表tab_accttype没有相应数据' || C1.acctid;
               	INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, out_s_errmsg);
           		out_n_errno := 4;
           		COMMIT;
           		RETURN;
           	WHEN OTHERS THEN
                	s_subareaid := '';
                	out_s_errmsg := '取表tab_accttype错误 ' || C1.acctid  || SUBSTR(SQLERRM,1,100);
                	INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, out_s_errmsg);
           		out_n_errno := 4;
           		COMMIT;
           		RETURN;
		END;

		BEGIN
			INSERT INTO rept_acctfee(acctid, predeposittypeid, source_id, lastfee,
				thisfee, balance, billingcycl, areaid, subareaid, acctypeid)
			VALUES(C1.acctid, C1.predeposittypeid, C1.sourceid, n_lastfee, n_thisfee,
			C1.thisbal, s_curbillingcycl, C1.areaid, s_subareaid, s_accttype);
			EXCEPTION
			WHEN OTHERS THEN
				out_s_errmsg := 'INSERT表tab_subscrb错误: '  || SUBSTR(SQLERRM,1,100);
	       		INSERT INTO rept_log(log_time, log_remark) VALUES(SYSDATE, out_s_errmsg);
	    		out_n_errno := 5;
	    		COMMIT;
	    		RETURN;
		END;

		n_cnt := n_cnt+1;
		IF (n_cnt MOD 5000) = 0 THEN
			COMMIT;
    	END IF;

	END LOOP;

	COMMIT;

END PROC_REPT_ACCTFEE;


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -