db2存储过程 动态拼接sql 、输出数据集示例
*****部分都是表名。因为隐私关系,替换为*了。
1 CREATE PROCEDURE "BI_DM"."SP_GCYP_REPORT" (
2 startdate varchar(20)
3 )
4 dynamic result sets 1
5 LANGUAGE SQL
6
7 begin
8 declare L_Workdate_Start INT;
9 declare D_Workdate_Start DATE;
10 declare D_Workdate_End DATE;
11
12 ---动态sql变量声明
13 --declare sqlcreatetable varchar(5000);
14 declare sqldelete varchar(5000);
15 declare sqlinsert varchar(5000);
16 declare sql1 varchar(5000);
17 declare sql2 varchar(5000);
18 declare sql3 varchar(5000);
19 declare sqlinsert2 varchar(5000);
20
21 declare monthnumber varchar(32);
22 declare lastmonthnumber varchar(32);
23 declare yearnumber varchar(32);
24
25 --循环参数
26 declare num1 varchar(32);
27 declare num2 varchar(32);
28
29
30 --------------定义输出游标,定义必须在变量赋值的上面,否则会报错。max合并前三列,和最后一列-------------------------------------
31 declare clientcur cursor with return
32 for
33 select id,b.ITEMNAME
34 ,max(本月采购数量) as 本月采购数量
35 ,max(上月末库存数量) as 上月末库存数量
36 ,max(本月采购总金额) as 本月采购总金额
37 ,max(本月院内使用数量) as 本月院内使用数量
38 from ***** a
39 join ***** b on a.ID=b.itemid
40 group by id,b.ITEMNAME;
41
42 --------------定义输出游标-------------------------------------
43
44
45 -- set D_Workdate_Start=to_date(substr(startdate,1,8)||'01 00:00:00','yyyy-mm-dd hh24:mi:ss');
46 set D_Workdate_Start=to_date(startdate||' 00:00:00','yyyy-mm-dd hh24:mi:ss');
47 set D_Workdate_Start= truncate(D_Workdate_Start,'MM');--获取选取的月份第一天
48 set D_Workdate_End=D_Workdate_Start + 1 month;
49
50 set monthnumber=case when month(D_Workdate_Start)<10 then 0||to_char(month(D_Workdate_Start)) else to_char(month(D_Workdate_Start)) end;
51 set lastmonthnumber=case when (month(D_Workdate_Start)-1)<10 then 0||to_char(month(D_Workdate_Start)-1) else to_char(month(D_Workdate_Start)-1) end;
52 set yearnumber=year(D_Workdate_Start);
53
54
55 ---- ---- ----此为建表备用,如果没有该表则创建 ---- ---- ---- ----
56 /*
57 set sqlcreatetable =' create table ******
58 (ID varchar(128)
59 ,ITEMNAME varchar(128)
60 ,本月采购数量 varchar(128)
61 ,上月末库存数量 varchar(128)
62 ,本月采购总金额 varchar(128)
63 ,本月院内使用数量 varchar(128)
64 )';
65
66 if ((select count(1) from syscat.tables where TABNAME='*****')=0)
67 then
68 PREPARE create1 FROM sqlcreatetable;
69 EXECUTE create1;
70 end if;*/
71 ---- ---- ----此为建表备用,如果没有该表则创建 ---- ---- ---- ----
72
73
74
75 --------------循环算每个月库存-------------------------------------
76 set sql2=' ';
77 set num1=to_number(monthnumber);
78
79 while num1 > 0 do
80 set num2=case when to_char(num1)<10 then 0||to_char(num1) else to_char(num1) end;
81
82 set sql2=sql2||'M'||num2||'I_Q
83 - M'||num2||'O_Q
84 + ';
85 set num1=num1-1;
86 end while;
87 ------------------去掉最后的加号---------------------------------
88 set sql2=substr(sql2,1,length(sql2)-2);
89 --------------循环算每个月库存-------------------------------------
90
91
92 --------------插入拼接的三列数据-------------------------------
93 set sql1='M'||monthnumber||'I_Q as 本月采购数量,';
94 set sql2=sql2||' + M00E_Q as 上月末库存数量,'; -----最后加上年初
95 set sql3='M'||monthnumber||'I_S as 本月采购总金额,';
96
97 if to_number(monthnumber)=1 ---如果是1月,执行用年初库存数量
98 then
99 set sql2='M00E_Q as 上月末库存数量,';
100
101 end if;
102 ---------------------------------------------------
103 set sqldelete='delete from ********';
104 set sqlinsert='insert into ********(ID,本月采购数量,上月末库存数量,本月采购总金额,本月院内使用数量)
105 select ITEMID,'||sql1||sql2||sql3||'0
106 from SSA_HIS.INV_DRUG_MONTH
107 where ORGID_PL=''010101030201''
108 and ITEMID in (
109 select a.ITEMID
110 from ********* a
111 where NEGOTIATESMEDICINEFLAG=1)
112 and year='||yearnumber;
113 --------------插入拼接的三列数据-------------------------------
114
115
116
117 ------------插入本月院内使用数量-----------------------------------
118
119 set D_Workdate_Start=to_date(D_Workdate_Start,'yyyy-mm-dd');
120 set D_Workdate_End=to_date(D_Workdate_End,'yyyy-mm-dd');
121 set sqlinsert2='insert into *********(ID,本月院内使用数量)
122 SELECT b.ITEMID
123 , SUM(b.Quantity ) Quantity
124 from (
125 select ITEMID
126 from *********
127 where ItemID in (select ItemID
128 from ******** a
129 where NEGOTIATESMEDICINEFLAG=1 )
130 and CateID like ''01%''
131 )a
132 join ******** b on a.ITEMID =b.ITEMID
133 where b.BillDate > to_date('''||D_Workdate_Start||''',''yyyy-mm-dd'')
134 AND b.BillDate <= to_date('''||D_Workdate_End||''',''yyyy-mm-dd'')
135 group by b.ItemID ';
136 ------------插入本月院内使用数量-----------------------------------
137
138 PREPARE delete1 FROM sqldelete; --清除历史记录
139 EXECUTE delete1;
140 PREPARE insert1 FROM sqlinsert;--插入月库存
141 EXECUTE insert1;
142 PREPARE insert2 FROM sqlinsert2;--插入使用量
143 EXECUTE insert2;
144
145
146
147
148
149 open clientcur;
150
151 end
db2存储过程 动态拼接sql 、输出数据集示例的更多相关文章
- mysql 存储过程动态拼接sql并执行赋值
)) BEGIN ## 定义变量 ,) ; ## @表示全局变量 相当于php $ ## 拼接赋值 INTO 必须要用全局变量不然语句会报错 SET @strsql = CONCAT('SELECT ...
- mysql 存储过程动态执行sql语句
之前经常在程序中拼接sql语句,其实我们也可以在存储过程中拼接sql 语句,动态的执行~~ 代码如下: DROP PROCEDURE IF EXISTS SearchByDoctor;CREATE P ...
- 动态拼接 sql的时候 里面 如果有变量的话 按上面的方式进行处理
set @Sql_Sql = N' select top 1 @m_zw=zw,@m_zh=temp from ket where zd=''ddd'' ' print @Sql_Sql EXEC s ...
- java动态拼接sql语句并且执行时给sql语句的参数赋值
问题 在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题. 解决方法 ...
- python 根据传进来的参数,动态拼接sql
根据传进来的参数,动态拼接sql,可用于实现一个方法,有些字段不确定,又用到的情况,如查询,三个查询条件,有的时候只用到一个查询条件,其他用不到则不需要拼接 def show_runjob_detai ...
- 存储过程中拼接SQL语句
很多时候我们需要利用参数在存储过程中重新组织SQL语句,在存储过程中拼接的SQL语句只是一个字符串,不会被直接执行,所以加一个execute执行它就可以了.具体看如下演示代码: 代码: set ANS ...
- 在mysql存储过程中拼接sql解决in的字段类型不匹配问题
一个朋友问我一个问题,他写了一个存储过程,并在存储过程调用了另外一个自定义的函数.该函数返回类型如'1,34,56'的字符串,并将该字符串作为存储过程的select的id条件. begin DECLA ...
- MSSQL存储过程实现拼接sql的注意点
这里我昨天碰到的问题就是执行一段根据变量tableName对不同的表进行字段状态的更改.由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面. 这里就出现了一个问题,我花费 ...
- Java 使用Query动态拼接SQl
之前有做个一个自定义报表的查询,这里使用的是一个动态的sql拼接,是前端选择了什么指标就查询什么信息!(这里的指标是多个表的字段,前端随便选择了这些指标,然后后端根据这些指标拼接sql,返回这些指标的 ...
- db2存储过程动态sql被截断
编写存储过程,使用动态sql时,调试时发现变量赋值后被截断. 关键代码如下: 实现的效果是先把上下游做对比的sql语句和相关参数存入RKDM_DATA_VOID_RULE, 执行存储过程后把两个sql ...
随机推荐
- Linux几种网络模式介绍
简单介绍Linux几种网络模式 虚拟化层次: 打开vmware虚拟机,我们可以在选项栏的"编辑"下的"虚拟网络编辑器"中看到VMnet0(桥接模式).V ...
- 《Terraform 101 从入门到实践》 第四章 States状态管理
<Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 军书十二卷,卷卷有爷名. 为 ...
- C-03\浮点数转换与编码和补码
工程生成文件格式了解(常用) 工具 文件 作用 vc++6.0 .dsw 最高级别的配置文件,记录了整个工作空间的配置信息,是一个纯文本的文件,创建新项目时自动生成 vc++6.0 .dsp 配置文件 ...
- LinkedHashmap简要说明
https://segmentfault.com/a/1190000012964859 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 H ...
- P32_全局配置 - tabBar
什么是 tabBar tabBar 是移动端应用常见的页面效果,用于实现多页面的快速切换.小程序中通常将其分为: 底部 tabBar 顶部 tabBar 注意:tabBar中只能配置最少 2 个.最多 ...
- 基于minikube快速搭建kubernetes单节点环境
一.说明 本文主要介绍在 Centos7 环境下基于 Minikube 来快速部署 Kubernetes 单节点集群环境,并在浏览器上访问部署在 k8s 上的 dashboard 服务. 二.Mini ...
- js实现替换对象(json)格式的键名
某些场景下,我们拿到的键名与预期的键名不符,这个时候就需要替换键名来得到我们想要的内容 let obj = [ { id:1, title:'zs' }, { id:2, title:'ls' } ] ...
- 安卓逆向 ARM基础篇 二
1.寄存器寻址的八中方法 1.立即寻址 二 寄存器寻址 三 寄存器移位寻址 过程 R2 移位 传给R0 四 寄存器间接寻址 五 基址寻址 六 多寄存器寻址 七 堆栈寻址 七 堆栈寻址
- ve-plus:基于 vue3.x 桌面端UI组件库|vue3组件库
VE-Plus 自研轻量级 vue3.js 桌面pc端UI组件库 经过一个多月的筹划及开发,今天给大家带来一款全新的Vue3桌面端UI组件库VEPlus.新增了35+常用的组件,采用vue3 setu ...
- Docker中使用Nginx镜像配置HTTPS和HTTP强制使用HTTPS访问(4)
一.前言 上一文章当中说了Docker-Compose管理镜像和容器,本文章介绍使用Docker中Nginx镜像,使用的工具和ubuntu版本在ASP.NET CORE部署在Docker容器中已详细说 ...