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

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. Python修改柱状图边缘柱子与图边界的距离

      本文介绍基于Python中matplotlib.pyplot模块,修改柱状图.条形图最两侧的柱子与图像边缘之间距离的方法.   最近,绘制了一个水平的柱状图,但是发现图的上.下边距(不是柱子与柱子 ...

  2. 浅谈Python中的in,可能有你不知道的

    Python中的in,没那么简单,虽然也不难 https://docs.python.org/zh-cn/3.9/reference/expressions.html#membership-test- ...

  3. 【OpenWrt】N1刷机过程及旁路由设置(通用)

    最近买了个N1盒子,从源系统刷到OpenWrt,总结一下整体过程,大部分都来源于网络教程和自己实践,如有错误欢迎指出! N1盒子刷机 固件准备 最著名的应该是F大的吧,原贴地址:[2023-2-14] ...

  4. STM32F0_HAL初始化系列:串口DMA输出

    static void MX_USART1_UART_Init(void) { /* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_ ...

  5. TS在实际开发中的使用

    TS的基础使用 // 数字 let num = ref<number>(100) // 文字 let str = rer<string>('文字') // boolean le ...

  6. 关于集合中remove()方法的问题

    首先上一段代码: needDelete()方法:决定是否要删除 public static boolean needDelete(Object obj) { if (obj.equals(" ...

  7. Redis 源码解读之 Rehash 的调用时机

    Redis 源码解读之 Rehash 的调用时机 背景和问题 本文想要解决的问题 什么时机触发 Rehash 操作? 什么时机实际执行 Rehash 函数? 结论 什么时机触发 Rehash 操作? ...

  8. Docker中Mysql容器忘记密码的处理方法

    今天非常的倒霉,因为学习了Vue的相关知识,想自己写一个后端服务器来练习一下Vue 然后 忘记了Docker中Mysql的密码... 很抽象 下面是我的解决方法 一.如果在本地的Navicat Pre ...

  9. SX【2020.01.09】NOIP提高组模拟赛(day1)

    [2020.01.09]NOIP提高组模拟赛(day1) 这次考得不理想,只做了前两题,后两题没时间做,说明做题速度偏慢. source : 100 + 20 + 0 + 0 = 120 rank7 ...

  10. window 运行 jar包方式

    所有文件 1.将jar包指定为bat批处理文件,然后可以双击启动 新建start2.txt 编辑保存一下内容,修改start2.txt后缀为bat,点击运行(此方法当前命令窗口关闭后,程序也关闭) j ...