设为首页 收藏本站
查看: 1023|回复: 0

[经验分享] DB2嵌套循环

[复制链接]

尚未签到

发表于 2016-11-13 10:33:02 | 显示全部楼层 |阅读模式
测试环境搭建:
1.测试表:年级、班级、学生、临时表

CREATE TABLE HTSAP.TESTSTU(
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE),
CLASSNAME VARCHAR(15),
NAME VARCHAR(15),
AGE INTEGER,
SEX CHAR(4)
);
CREATE TABLE HTSAP.TESTCLASS(
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE),
NAME VARCHAR(15),
GREADNAME VARCHAR(15)
);
CREATE TABLE HTSAP.TESTGREAD(
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE),
NAME VARCHAR(15)
);
INSERT INTO HTSAP.TESTSTU(CLASSNAME,NAME,AGE,SEX)
VALUES('一班','XIAOMING1',15,'男'),('一班','XIAOMING2',15,'男'),('一班','XIAOMING3',15,'男'),
('二班','XIAOMING1',15,'男'),('二班','XIAOMING2',15,'男'),('二班','XIAOMING3',15,'男')
;
INSERT INTO HTSAP.TESTCLASS(NAME,GREADNAME)
VALUES('一班','一年级'),('二班','二年级');
INSERT INTO HTSAP.TESTGREAD(NAME)
VALUES('一年级'),('二年级');
DROP TABLE SESSION.TEMP_TEST;
DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_TEST
(
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE),
NAME VARCHAR(15),
AGE INTEGER,
SEX CHAR(4)
)ON COMMIT PRESERVE ROWS;

测试存储过程:

CREATE PROCEDURE LOOP_TEST (  )
DYNAMIC RESULT SETS 1
------------------------------------------------------------------------
-- SQL Stored Procedure
------------------------------------------------------------------------
P1: BEGIN
-- Declare cursor
DECLARE STUNAME VARCHAR(15);
DECLARE AGE INTEGER;
DECLARE SEX CHAR(4);
DECLARE CLASSNAME VARCHAR(15);
DECLARE GREADNAME VARCHAR(15);
DECLARE STMT VARCHAR(120);
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE HSQLCODE INTEGER DEFAULT 0;
DECLARE C1 CURSOR WITH RETURN FOR SELECT * FROM SESSION.TEMP_TEST;
DECLARE C2 CURSOR  FOR S2;
DECLARE C3 CURSOR  FOR S3;
DECLARE C4 CURSOR  FOR S4;
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET HSQLCODE = SQLCODE;
END;
SET STMT = 'SELECT G.NAME FROM HTSAP.TESTGREAD AS G';
PREPARE S2 FROM STMT;
OPEN C2;
LOOP_C2:
LOOP
FETCH C2 INTO GREADNAME;
IF HSQLCODE <> 0 THEN
SET HSQLCODE = 0;
LEAVE LOOP_C2;
END IF;
SET STMT = 'SELECT C.NAME FROM HTSAP.TESTCLASS AS C WHERE C.GREADNAME = '''||CHAR(GREADNAME)||'''';
PREPARE S3 FROM STMT;
OPEN C3;
LOOP_C3:
LOOP
FETCH C3 INTO CLASSNAME;
IF HSQLCODE <> 0 THEN
SET HSQLCODE = 0;
LEAVE LOOP_C3;
END IF;
SET STMT = 'SELECT S.NAME,S.AGE,S.SEX FROM HTSAP.TESTSTU AS S WHERE S.CLASSNAME = '''||CHAR(CLASSNAME)||'''';
PREPARE S4 FROM STMT;
OPEN C4;
LOOP_C4:
LOOP
FETCH C4 INTO STUNAME,AGE,SEX;
IF HSQLCODE <> 0 THEN
SET HSQLCODE = 0;
LEAVE LOOP_C4;
END IF;
INSERT INTO SESSION.TEMP_TEST(NAME,AGE,SEX) VALUES(STUNAME,AGE,SEX);
END LOOP;
CLOSE C4;
END LOOP;
CLOSE C3;
END LOOP;
CLOSE C2;
OPEN C1;
END P1

问题与解决:
问题:
DB2动态SQL语句变量赋值字符串无法识别问题。

SET STUNAME = 'XIAOMING2';
SET CLASSNAME = '一班';
SET STMT = 'SELECT S.NAME,S.AGE,S.SEX FROM HTSAP.TESTSTU AS S WHERE S.NAME = '||CHAR(STUNAME)||' AND S.CLASSNAME = '||CHAR(CLASSNAME);

在网上的资料中队字符串变量的处理都是这样就可以了,但是在实际使用中,变量没有单引号,无法被DB2识别。
解决:

SET STMT = 'SELECT S.NAME,S.AGE,S.SEX FROM HTSAP.TESTSTU AS S WHERE S.NAME = '''||CHAR(STUNAME)||''' AND S.CLASSNAME = '''||CHAR(CLASSNAME)||'''';

第一个引号:转义
第二个引号:表示引号
第三个引号:返回sql语句
||CHAR(STUNAME)||:为sql语句赋值。
最后面的第四个引号:结束sql语句

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-299622-1-1.html 上篇帖子: db2迁移实战 下篇帖子: db2汉字存储
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表