惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
T
Tenable Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
Intezer
C
Cyber Attacks, Cyber Crime and Cyber Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Scott Helme
Scott Helme
C
Cisco Blogs
T
Tor Project blog
P
Privacy International News Feed
Forbes - Security
Forbes - Security
S
Schneier on Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Privacy & Cybersecurity Law Blog
Know Your Adversary
Know Your Adversary
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
T
Threatpost
S
Security @ Cisco Blogs
H
Heimdal Security Blog
L
LINUX DO - 热门话题
N
News | PayPal Newsroom
N
News and Events Feed by Topic
Hugging Face - Blog
Hugging Face - Blog
T
Troy Hunt's Blog
WordPress大学
WordPress大学
腾讯CDC
V
V2EX
IT之家
IT之家
P
Proofpoint News Feed
S
Securelist
Hacker News: Ask HN
Hacker News: Ask HN
T
Threat Research - Cisco Blogs
爱范儿
爱范儿
雷峰网
雷峰网
Spread Privacy
Spread Privacy
Application and Cybersecurity Blog
Application and Cybersecurity Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main
The Cloudflare Blog
美团技术团队
月光博客
月光博客
博客园 - Franky
小众软件
小众软件
V
Vulnerabilities – Threatpost
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志

博客园 - 无意

程序猿的故事 余额宝收益查询_最新收益率 外国名著小说大全 linux 查看系统版本 32位 or 64位 redhat linux websphere 6 命令行安装(静默安装) 名著小说在线阅读 历史天气查询 oracle分区表之交换分区 altertable exchange partition with table 新工作 oracle 日常维护工作内容 RedHat Linux常见命令 Oracle to_char格式化函数 ROLLUP和CUBE语句 Oracle分析函数参考手册 oracle游标 Oracle Merge into 详细介绍 11gr2中DBA_TAB_MODIFICATIONS视图返回结果异常 设置AUTOTRACE时出现SP2-0611错误 利用dbms_system包SET_SQL_TRACE_IN_SESSION开启sql跟踪
oracle 存储过程模板
无意 · 2010-05-27 · via 博客园 - 无意

--创建存储过程
CREATE OR REPLACE PROCEDURE xxxxxxxxxxx_p
(
   --参数IN表示输入参数,
    --OUT表示输入参数,类型可以使用任意Oracle中的合法类型。
   is_ym  IN CHAR
)
AS
--定义变量
vs_msg   VARCHAR2(4000);   --错误信息变量
vs_ym_beg  CHAR(6);      --起始月份
vs_ym_end  CHAR(6);      --终止月份
vs_ym_sn_beg CHAR(6);     --同期起始月份
vs_ym_sn_end CHAR(6);     --同期终止月份

--定义游标(简单的说就是一个可以遍历的结果集)
CURSOR cur_1 IS
  SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,SUM(usd_amt)/10000 usd_amt_sn
  FROM BGD_AREA_CM_M_BASE_T
    WHERE ym >= vs_ym_sn_beg
       AND ym <= vs_ym_sn_end
   GROUP BY area_code,CMCODE;

BEGIN
--用输入参数给变量赋初值,用到了Oralce的SUBSTR TO_CHAR ADD_MONTHS TO_DATE 等很常用的函数。
vs_ym_beg := SUBSTR(is_ym,1,6);
vs_ym_end := SUBSTR(is_ym,7,6);
vs_ym_sn_beg := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'), -12),'yyyymm');
vs_ym_sn_end := TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'), -12),'yyyymm');
--先删除表中特定条件的数据。
DELETE FROM xxxxxxxxxxx_T WHERE ym = is_ym;
  --然后用内置的DBMS_OUTPUT对象的put_line方法打印出影响的记录行数,其中用到一个系统变量SQL%rowcount
DBMS_OUTPUT.put_line('del上月记录='||SQL%rowcount||'条');

INSERT INTO xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM BGD_AREA_CM_M_BASE_T
  WHERE ym >= vs_ym_beg
  AND ym <= vs_ym_end
GROUP BY area_code,CMCODE;

DBMS_OUTPUT.put_line('ins当月记录='||SQL%rowcount||'条');
--遍历游标处理后更新到表。遍历游标有几种方法,用for语句是其中比较直观的一种。
FOR rec IN cur_1 LOOP
  UPDATE xxxxxxxxxxx_T
  SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn
   WHERE area_code = rec.area_code
   AND CMCODE = rec.CMCODE
   AND ym = is_ym;
END LOOP;

COMMIT;
--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
EXCEPTION
   WHEN OTHERS THEN
      vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);
   ROLLBACK;
   --把当前错误记录进日志表。
   INSERT INTO LOG_INFO(proc_name,error_info,op_date)
   VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);
   COMMIT;
   RETURN;
END;

模板二:

--ORACLE存储过程实例:
CREATE OR REPLACE PROCEDURE CL_24_MONTHS_STATUS
--(无输入/输出参数)
IS
--存储过程开始
BEGIN
DECLARE
--声明变量
V_OP_NUM CHAR(20);
V_START_DATE DATE;
V_END_DATE DATE;
V_COUNT NUMBER;
V_COUNT1 NUMBER;
V_24MONTHS_FLAG VARCHAR(24);
V_DATE_OPENED DATE;
V_MATURE_DATE DATE;
V_OVERDUE NUMBER;
V_STATUS CHAR(1);
V_REPORTDATE DATE;
V_BILLING_DATE1 DATE;
V_BILLING_DATE2 DATE;
--声明游标
CURSOR OVERDUE_CURSOR IS
SELECT OP_NUM,DATE_OPENED,MATURE_DATE,STATUS
FROM CL_VALID_CONTRACT
WHERE TERM_FREQ<>'5' ORDER BY OP_NUM;
--程序体开始
BEGIN
OPEN OVERDUE_CURSOR;

SELECT REPORTDATE INTO V_REPORTDATE FROM T_ETLDATE;

DELETE FROM CL_MONTHS24_STATUS_TOTAL;

LOOP
V_24MONTHS_FLAG:='';

V_END_DATE:=V_REPORTDATE;

FETCH  OVERDUE_CURSOR INTO V_OP_NUM,V_DATE_OPENED,V_MATURE_DATE,V_STATUS;

--计算需要计算的最早和最晚月份
IF ADD_MONTHS(V_END_DATE,-24)<V_DATE_OPENED
THEN V_START_DATE:=LAST_DAY(V_DATE_OPENED);

ELSE V_START_DATE:=ADD_MONTHS(V_END_DATE,-23);

END IF;

EXIT WHEN OVERDUE_CURSOR%NOTFOUND;

LOOP
EXIT WHEN V_END_DATE <= V_START_DATE;

--计算前23个月的还款状态
SELECT NVL(MAX(BILLING_DATE),LAST_DAY(V_START_DATE))
INTO V_BILLING_DATE1
FROM CL_VALID_BALANCE B
WHERE OP_NUM=V_OP_NUM AND LAST_DAY(BILLING_DATE)=LAST_DAY(V_START_DATE);

SELECT NVL(MAX(BILLING_DATE),LAST_DAY(ADD_MONTHS(V_START_DATE,-1)))
INTO V_BILLING_DATE2
FROM CL_VALID_BALANCE B
WHERE OP_NUM=V_OP_NUM AND LAST_DAY(BILLING_DATE)=LAST_DAY(ADD_MONTHS(V_START_DATE,-1));

SELECT COUNT(*)
INTO V_COUNT
FROM CL_VALID_BALANCE
WHERE OP_NUM=V_OP_NUM
AND BILLING_DATE BETWEEN V_BILLING_DATE2+1 AND V_BILLING_DATE1;

SELECT NVL(MAX(V_BILLING_DATE1-BILLING_DATE+1),-1)
INTO V_COUNT1
FROM CL_VALID_OVERDUE
WHERE OP_NUM=V_OP_NUM AND V_BILLING_DATE1 BETWEEN BILLING_DATE AND ACTUAL_DATE-1;

IF V_COUNT=0 AND V_COUNT1<=0 THEN V_24MONTHS_FLAG:=CONCAT(V_24MONTHS_FLAG,'*');

ELSIF V_COUNT1<=0 THEN V_24MONTHS_FLAG:=CONCAT(V_24MONTHS_FLAG,'N');

ELSIF TRUNC((V_COUNT1-1)/30+1)<8 THEN V_24MONTHS_FLAG:=CONCAT(V_24MONTHS_FLAG,TRUNC((V_COUNT1-1)/30+1));

ELSE V_24MONTHS_FLAG:=CONCAT(V_24MONTHS_FLAG,'7');

END IF;

V_START_DATE:=ADD_MONTHS(V_START_DATE,1);

END LOOP;

--计算最后一个月的还款状态
SELECT NVL(MAX(BILLING_DATE),LAST_DAY(V_START_DATE))
INTO V_BILLING_DATE1
FROM CL_VALID_BALANCE B
WHERE OP_NUM=V_OP_NUM AND LAST_DAY(BILLING_DATE)=LAST_DAY(V_START_DATE);

SELECT NVL(MAX(BILLING_DATE),LAST_DAY(ADD_MONTHS(V_START_DATE,-1)))
INTO V_BILLING_DATE2
FROM CL_VALID_BALANCE B
WHERE OP_NUM=V_OP_NUM AND LAST_DAY(BILLING_DATE)=LAST_DAY(ADD_MONTHS(V_START_DATE,-1));

SELECT COUNT(*)
INTO V_COUNT
FROM CL_VALID_BALANCE
WHERE OP_NUM=V_OP_NUM
AND BILLING_DATE BETWEEN V_BILLING_DATE2+1 AND V_BILLING_DATE1;

SELECT NVL(MAX(V_BILLING_DATE1-BILLING_DATE+1),-1)
INTO V_COUNT1
FROM CL_VALID_OVERDUE
WHERE OP_NUM=V_OP_NUM AND V_BILLING_DATE1 BETWEEN BILLING_DATE AND ACTUAL_DATE-1;

IF V_STATUS='9'
THEN V_24MONTHS_FLAG:=CONCAT(V_24MONTHS_FLAG,'C');

ELSIF V_COUNT=0 AND V_COUNT1<=0 THEN V_24MONTHS_FLAG:=CONCAT(V_24MONTHS_FLAG,'*');

ELSIF V_COUNT1<=0 THEN V_24MONTHS_FLAG:=CONCAT(V_24MONTHS_FLAG,'N');

ELSIF TRUNC((V_COUNT1-1)/30+1)<8 THEN V_24MONTHS_FLAG:=CONCAT(V_24MONTHS_FLAG,TRUNC((V_COUNT1-1)/30+1));

ELSE V_24MONTHS_FLAG:=CONCAT(V_24MONTHS_FLAG,'7');

END IF;

INSERT INTO CL_MONTHS24_STATUS_TOTAL VALUES (V_OP_NUM,LPAD(V_24MONTHS_FLAG,24,'/'));

COMMIT;

END LOOP;
--关闭游标
CLOSE OVERDUE_CURSOR;
--程序体结束
END;
--存储过程结束
END;