*****部分都是表名。因为隐私关系,替换为*了。  

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 、输出数据集示例的更多相关文章

  1. mysql 存储过程动态拼接sql并执行赋值

    )) BEGIN ## 定义变量 ,) ; ## @表示全局变量 相当于php $ ## 拼接赋值 INTO 必须要用全局变量不然语句会报错 SET @strsql = CONCAT('SELECT ...

  2. mysql 存储过程动态执行sql语句

    之前经常在程序中拼接sql语句,其实我们也可以在存储过程中拼接sql 语句,动态的执行~~ 代码如下: DROP PROCEDURE IF EXISTS SearchByDoctor;CREATE P ...

  3. 动态拼接 sql的时候 里面 如果有变量的话 按上面的方式进行处理

    set @Sql_Sql = N' select top 1 @m_zw=zw,@m_zh=temp from ket where zd=''ddd'' ' print @Sql_Sql EXEC s ...

  4. java动态拼接sql语句并且执行时给sql语句的参数赋值

    问题 在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题. 解决方法 ...

  5. python 根据传进来的参数,动态拼接sql

    根据传进来的参数,动态拼接sql,可用于实现一个方法,有些字段不确定,又用到的情况,如查询,三个查询条件,有的时候只用到一个查询条件,其他用不到则不需要拼接 def show_runjob_detai ...

  6. 存储过程中拼接SQL语句

    很多时候我们需要利用参数在存储过程中重新组织SQL语句,在存储过程中拼接的SQL语句只是一个字符串,不会被直接执行,所以加一个execute执行它就可以了.具体看如下演示代码: 代码: set ANS ...

  7. 在mysql存储过程中拼接sql解决in的字段类型不匹配问题

    一个朋友问我一个问题,他写了一个存储过程,并在存储过程调用了另外一个自定义的函数.该函数返回类型如'1,34,56'的字符串,并将该字符串作为存储过程的select的id条件. begin DECLA ...

  8. MSSQL存储过程实现拼接sql的注意点

    这里我昨天碰到的问题就是执行一段根据变量tableName对不同的表进行字段状态的更改.由于服务器原因,我不能直接在数据访问层写SQL,所以只好抽离出来放到存储过程里面. 这里就出现了一个问题,我花费 ...

  9. Java 使用Query动态拼接SQl

    之前有做个一个自定义报表的查询,这里使用的是一个动态的sql拼接,是前端选择了什么指标就查询什么信息!(这里的指标是多个表的字段,前端随便选择了这些指标,然后后端根据这些指标拼接sql,返回这些指标的 ...

  10. db2存储过程动态sql被截断

    编写存储过程,使用动态sql时,调试时发现变量赋值后被截断. 关键代码如下: 实现的效果是先把上下游做对比的sql语句和相关参数存入RKDM_DATA_VOID_RULE, 执行存储过程后把两个sql ...

随机推荐

  1. 12月13日内容总结——路由分发、名称空间、虚拟环境、视图层三板斧、JsonResponse对象、request对象获取文件、视图层FBV与CBV的源码剖析、模版层简介

    目录 一.路由分发 二.名称空间 方式1:名称空间 方式2:别名不冲突即可 三.虚拟环境 pycharm创建虚拟环境 命令行的方式创建虚拟环境: 创建虚拟环境的命令 激活与关闭虚拟环境 四.视图层之必 ...

  2. C#DataTableRow列值互转

    1 /// <summary> 2 /// 把DataRow中的某一列值转换为CheckState类型 3 /// </summary> 4 /// <param nam ...

  3. 构建api gateway之 基于etcd实现动态配置同步

    配置中心 在之前 tcp的yaml配置 介绍了如何监听yaml文件变化然后更新配置. 当然假如我们有很多实例,那么yaml改动将是非常痛苦的事情,那么如何做到配置文件统一管理,实时更新呢? 我们可以引 ...

  4. python70 前端框架之vue js的集中循环方式、key值的解释、input事件、v-model双向数据绑定、过滤案例、事件修饰符、按键修饰符、表单控制

    js的几种循环方式 v-for可以循环的变量 可以循环的: 数组.数组带索引 对象.对象带key.value 字符串 字符串带索引 数字.数字带索引 <!DOCTYPE html> < ...

  5. P13_协同工作_小程序权限管理的概念以及成员管理的两个方面

    协同工作和发布 - 协同工作 了解权限管理需求 在中大型的公司里,人员的分工非常仔细:同一个小程序项目,一般会有不同岗位.不同角色的员工同时参与设计与开发. 此时出于管理需要,我们迫切需要对不同岗位. ...

  6. 学习Java Day 5

    今天看视频学习了一下eclipse的使用方法,解决了昨天运行不了的结果,并尝试了一下java的输入:

  7. day15-SpringMVC执行流程

    SpringMVC执行流程 1.SpringMVC执行流程分析图 例子 (1)创建 HaloHandler package com.li.web.debug; import org.springfra ...

  8. java环境变量配置-最新版

    安装 百度"java下载"进入官网下载最新版,闭着眼睛安装: 配置jre 因java11以上不自带jre,需要我们自己配置,配置如下: # 终端进入jdk所在的目录后执行 bin\ ...

  9. 调式源码解决 seata 报错 can not get cluster name 问题

    最近在使用Spring Cloud整合分布式事务seata,项目启动之后,控制台一直报错: can not get cluster name in registry config 'service.v ...

  10. [EULAR文摘] 肢端MRI能否在未分化关节患者中甄别出RA患者

    标签: EULAR文摘; 未分化关节炎; 病程演变; MRI;早期诊断 肢端MRI能否在未分化关节患者中甄别出RA患者 Nieuwenhuis WP, et al. EULAR 2015.Presen ...