我的一个PLSQL【我】 循环嵌套、游标使用、变量定义、查询插入表、批量提交事务、字符串截取、动态sql拼接执行
代码块:
--CREATE OR REPLACE PROCEDURE PRO_REVENUE_STATISTICS --IS
DECLARE
--计数器
ins_counter PLS_INTEGER := 0;
--全部客户数量
l_all_cust_num REVENUE_STATISTICS_RES.All_Cust_Num%TYPE;
--全部收入
l_all_income REVENUE_STATISTICS_RES.All_Income%TYPE;
--当前账期月份字符串默认12个月
l_month_str varchar2(200) := '';
--当前账期月份数字
l_month_num number(20) ;
--当前全部收入查询条件
l_month_select varchar2(10000) := '' ;
BEGIN
--计算全部客户数
SELECT sum(CUST_TOTAL) count into l_all_cust_num from provi_cust_total;
--计算截止到当前账期的总收入
--计算当前最大月份201909
SELECT MAX(ACCOUNT_DAY) into l_month_str FROM ct_lan_node_inc;
l_month_num := TO_NUMBER(SUBSTR(l_month_str,5));
DBMS_OUTPUT.PUT_LINE('l_month_num:'||l_month_num); FOR moth_index IN 1 .. (l_month_num)
LOOP
l_month_select := l_month_select || 'SUM(TY_' || moth_index || ')+';
END LOOP;
--去掉最后一个加号
l_month_select := substr(l_month_select,0,length(l_month_select)-1);
--拼接查询
l_month_select := 'SELECT /*+ PARALLEL(12) */(' || l_month_select ||') FROM EDA_CUST_INC';
--DBMS_OUTPUT.PUT_LINE(l_month_select);
--执行查询字符串
EXECUTE IMMEDIATE l_month_select into l_all_income;
--DBMS_OUTPUT.PUT_LINE(l_all_income); --获取省份游标
FOR prov_rec IN (SELECT REGION_ID,CUST_TOTAL,REGION_NBR,REGION_NAME FROM PROVI_CUST_TOTAL p LEFT JOIN common_region c ON p.region_id = c.common_region_id)
LOOP
<<prov_loop>>
--获取市游标
FOR city_rec IN (SELECT COMMON_REGION_ID,REGION_NBR, REGION_NAME FROM COMMON_REGION WHERE PAR_REGION_ID = prov_rec.REGION_ID)
LOOP
--获取产品游标
FOR product_rec IN (select NAME,CODE FROM PRODUCT_CAT)
LOOP
--获取行业游标
FOR industry_rec IN ( select INDUSTRY_TYPE_ID,
PAR_INDUSTRY_TYPE_ID,
INDUSTRY_TYPE_GRADE,
INDUSTRY_TYPE_CODE,
INDUSTRY_TYPE_NAME
from industry_type)
LOOP
--获取身份证信息
FOR identity_index IN 1..2
LOOP
DECLARE
--定义单条查询结果游标
CURSOR revenues_cur IS
SELECT
COUNT(e.CUST_ID) AUDIT_CUST_NUM,COUNT(DISTINCT(e.PARTY_ID)) AUDIT_CUST_PARTY_NUM,
SUM(TY_1) TY_1 ,SUM(TY_2) TY_2,SUM(TY_3) TY_3,SUM(TY_4) TY_4,SUM(TY_5) TY_5,SUM(TY_6) TY_6,SUM(TY_7) TY_7,SUM(TY_8) TY_8,SUM(TY_9) TY_9,SUM(TY_10) TY_10,SUM(TY_11) TY_11,SUM(TY_12) TY_12,
SUM(LY_1) LY_1 ,SUM(LY_2) LY_2,SUM(LY_3) LY_3,SUM(LY_4) LY_4,SUM(LY_5) LY_5,SUM(LY_6) LY_6,SUM(LY_7) LY_7,SUM(LY_8) LY_8,SUM(LY_9) LY_9,SUM(LY_10) LY_10,SUM(LY_11) LY_11,SUM(LY_12) LY_12
FROM EDA_CUST_INC e
WHERE 1=1
AND e.STD_PRVNCE_CD = prov_rec.REGION_NBR
AND e.STD_LATN_CD = city_rec.REGION_NBR
AND e.PROD_TYPE = product_rec.CODE
AND EXISTS (SELECT 1
FROM CUST_CP_MERGE M
WHERE e.CUST_ID = M.CUST_ID
AND e.STD_LATN_CD = M.STD_LATN_CD)
AND e.PARTY_ID IS NOT NULL AND UPPER(e.PARTY_ID) != 'NULL'
AND EXISTS (SELECT 1
FROM PARTY P
WHERE e.PARTY_ID = p.PARTY_ID
AND p.IDENTITY_TYPE = identity_index)
and exists (select 1
from party_org po
where e.party_id = po.party_id
and po.INDUSTRY_TYPE_ID = industry_rec.INDUSTRY_TYPE_ID);
--定义单条查询结果变量
revenue_rec revenues_cur%ROWTYPE;
BEGIN
--打开游标
OPEN revenues_cur;
--给变量赋值
FETCH revenues_cur INTO revenue_rec;
--DBMS_OUTPUT.PUT_LINE(prov_rec.REGION_NAME||'-'||city_rec.REGION_NAME||'-'||product_rec.NAME||'AUDIT_CUST_NUM'||revenue_rec.AUDIT_CUST_NUM||'AUDIT_CUST_PARTY_NUM'||revenue_rec.AUDIT_CUST_PARTY_NUM);
--插入结果表
INSERT INTO REVENUE_STATISTICS_RES2
(
ID,
PROVINCE_REGION_ID,
CITY_REGION_ID,
REGION_NAME,
PROD_TYPE,
INDUSTRY_TYPE_ID,
INDUSTRY_TYPE_CODE,
INDUSTRY_TYPE_NAME,
PAR_INDUSTRY_TYPE_ID,
INDUSTRY_TYPE_GRADE,
IDENTITY_TYPE,
IN_DATE,
AUDIT_CUST_NUM,
AUDIT_CUST_PARTY_NUM,
ALL_CUST_NUM,
ALL_INCOME,
TY_1,
TY_2,
TY_3,
TY_4,
TY_5,
TY_6,
TY_7,
TY_8,
TY_9,
TY_10,
TY_11,
TY_12,
LY_1,
LY_2,
LY_3,
LY_4,
LY_5,
LY_6,
LY_7,
LY_8,
LY_9,
LY_10,
LY_11,
LY_12
)
VALUES(
SEQ_REVENUE_STATISTICS_RES.NEXTVAL,
prov_rec.REGION_ID,
city_rec.COMMON_REGION_ID,
city_rec.region_name,
product_rec.code,
industry_rec.INDUSTRY_TYPE_ID,
industry_rec.INDUSTRY_TYPE_CODE,
industry_rec.INDUSTRY_TYPE_NAME,
industry_rec.PAR_INDUSTRY_TYPE_ID,
industry_rec.INDUSTRY_TYPE_GRADE,
identity_index,
sysdate,
revenue_rec.AUDIT_CUST_NUM,
revenue_rec.AUDIT_CUST_PARTY_NUM,
l_all_cust_num,
l_all_income,
revenue_rec.TY_1,
revenue_rec.TY_2,
revenue_rec.TY_3,
revenue_rec.TY_4,
revenue_rec.TY_5,
revenue_rec.TY_6,
revenue_rec.TY_7,
revenue_rec.TY_8,
revenue_rec.TY_9,
revenue_rec.TY_10,
revenue_rec.TY_11,
revenue_rec.TY_12,
revenue_rec.LY_1,
revenue_rec.LY_2,
revenue_rec.LY_3,
revenue_rec.LY_4,
revenue_rec.LY_5,
revenue_rec.LY_6,
revenue_rec.LY_7,
revenue_rec.LY_8,
revenue_rec.LY_9,
revenue_rec.LY_10,
revenue_rec.LY_11,
revenue_rec.LY_12
);
--关闭单条游标
CLOSE revenues_cur;
ins_counter := ins_counter+1;
--DBMS_OUTPUT.PUT_LINE(ins_counter);
--判断数量,如果数量到5000条提交一下事务
IF MOD(ins_counter,5000)=0
THEN
COMMIT;
END IF;
--结束内部块
END;
EXIT prov_loop;--退出到最外循环
END LOOP identity_loop;
END loop industry_loop;
END loop product_loop;
END LOOP city_loop;
END LOOP prov_loop;
DBMS_OUTPUT.PUT_LINE(ins_counter);
--提交最后的事务
COMMIT;
END;
我的一个PLSQL【我】 循环嵌套、游标使用、变量定义、查询插入表、批量提交事务、字符串截取、动态sql拼接执行的更多相关文章
- 我的一个PLSQL函数 先查询再插入数据库的函数 动态SQL拼接查询条件、通用游标、记录定义(封装部分查询字段并赋值给游标)、insert select 序列、常量【我】
先查询再插入数据库的函数 CREATE OR REPLACE FUNCTION F_REVENUE_SI(l_p_cd in Varchar2, l_c_cd in Varchar2, l_prod_ ...
- 条件语句;for循环 嵌套复习
//打印数字,0,1,8,10,12,每一个数单独占一行 //在全部数字打印完毕之后在打印数字的个数和所有数的和 int count = 0; int sum = 0; for (int i = 0; ...
- proc程序中使用PLSQL、Exception 、 动态SQL(day08)
. proc中如何使用plsql 1.1 使用plsql的语法 exec sql execute begin /* 相当于plsql的匿名块 */ end; end-exec; 在预编译时,需要加如下 ...
- .Net程序员学用Oracle系列(28):PLSQL 之SQL分类和动态SQL
1.SQL 语句分类 1.1.分类方法及类型 1.2.数据定义语言 1.3.数据操纵语言 1.4.其它语句 2.动态 SQL 理论 2.1.动态 SQL 的用途 2.2.动态 SQL 的语法 2.3. ...
- 在PL/SQL使用游标获取数据及动态SQL
1.游标概念: 当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针 2. 游标分类: A. 隐式游标 a. 在PL/ ...
- C#用链式方法表达循环嵌套
情节故事得有情节,不喜欢情节的朋友可看第1版代码,然后直接跳至“三.想要链式写法” 一.起缘 故事缘于一位朋友的一道题: 朋友四人玩LOL游戏.第一局,分别选择位置:中单,上单,ADC,辅助:第二局新 ...
- SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)
今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...
- sqlserver中的循环遍历(普通循环和游标循环)
sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student
- for循环与for循环嵌套
今天温习了下分支语句跟for循环,主要讲解了for循环嵌套,这里开始有点迷糊了,整理下思路在做练习 for循环嵌套用我自己的大白话来说就是一个外圈的for程序里面一个套着一个小的for程序,如果在范围 ...
随机推荐
- linux系统编程之进程(四)
今天继续研究进程相关的东东,话不多说,进入正题: SIGCHLD: 关于它,之前章节的学习中已经用到了,具体可以参考博文:http://www.cnblogs.com/webor2006/p/3500 ...
- InvenSense 美国公司
InvenSense为智能型运动处理方案的先驱.全球业界的领导厂商,驱动了运动感测人机接口在消费性电子产品上的应用.公司提供的集成电路(IC)整合了运动传感器-陀螺仪以及相对应的软件,有别于其他厂商, ...
- P1341 无序字母对[欧拉路]
题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 解析 毒瘤字符串读入 我就是不喜欢邻接 ...
- dt6.0之mip改造-img正则替换mip-img
最近没事,打算把自己的小项目改造为mip,进行测试学习,想把资讯栏目:http://zhimo.yuanzhumuban.cc/news/.全部改造为mip.但是MIP改造一项是:图片标签的改造.而且 ...
- vue input只允许输入数字
template: <input type="text" v-model="pageIndex" @keyup="inputChange&quo ...
- 2019-2020-1 20199301《Linux内核原理与分析》第四周作业
Week4 MenuOS的构造 一.上周复习 计算机的三大法宝: 存储程序计算机: 函数调用堆栈: 中断. 操作系统的两把宝剑: 中断上下文-保存现场和恢复现场 进程上下文 二.Linux内核源代码简 ...
- 使用笔记:TF辅助工具--tensorflow slim(TF-Slim)
如果抛开Keras,TensorLayer,tfLearn,tensroflow 能否写出简介的代码? 可以!slim这个模块是在16年新推出的,其主要目的是来做所谓的“代码瘦身” 一.简介 slim ...
- leetcode解题报告(31):Kth Largest Element in an Array
描述 Find the kth largest element in an unsorted array. Note that it is the kth largest element in the ...
- LibreOJ #6212. 「美团 CodeM 决赛」melon
二次联通门 : LibreOJ #6212. 「美团 CodeM 决赛」melon /* LibreOJ #6212. 「美团 CodeM 决赛」melon MDZZ 这是决赛题?? */ #incl ...
- 36、将RDD转换为DataFrame
一.概述 为什么要将RDD转换为DataFrame? 因为这样的话,我们就可以直接针对HDFS等任何可以构建为RDD的数据,使用Spark SQL进行SQL查询了.这个功能是无比强大的. 想象一下,针 ...