如何在DB2中执行复合sql

时间:2012-10-19 18:52:13

标签: sql db2 zos ibm-data-studio

我正面临着尝试理解DB2 sql的挑战(注意,我来自MS SQL Server):P。

这是一个场景,我有2个表,其中一个有ID和其他详细信息,第二个表有很多其他信息对应每个ID。

  ID              Info for ID
_______      ____> _______
|     |     /      |     |
|  T1 |<---------> |  T2 |
|_____|     \____> |_____|

来自SQL Server,我习惯于运行以下脚本:

Declare @ID  int
Declare @ID1 int

select @ID=ID from T1 where col1 = @ID1

select * from T2 where ID = @ID

这一切都在那里运行良好并给我一个ID对应的ID1,可以进一步用于从T2获取有关ID的所有信息。

可悲的是,在DB2中,这在我面前爆炸,我害怕如果我再次执行此查询,它将永远不认识我:(。

我做了一些研究并写了这篇文章(我甚至坚持变量声明)。

--#SET TERMINATOR @
BEGIN ATOMIC
DECLARE UID char(30);
END @

对于其他人来说效果很好,但我收到了以下错误:

BEGIN ATOMIC
DECLARE UID char(30);
END

ILLEGAL USE OF KEYWORD ATOMIC.  TOKEN  WAS EXPECTED. SQLCODE=-199, SQLSTATE=42601, DRIVER=3.63.108

其他信息:

IBM DB2 for z / OS V9.1 IBM Data Studio V3.1.1.0

[编辑:使用DECLARE] 我试过的另一件事不起作用:

CREATE VARIABLE UID CHAR(30) DEFAULT 'USERID'; 
select * from testdb2.T1 A WHERE A.UID=v_UID;
--some other activity goes here
--and here
DROP VARIABLE UID;

TIA, 阿比纳夫

<小时/> 2016年5月13日(星期五,13日)更新

创建存储过程是解决此问题的唯一方法:(

2 个答案:

答案 0 :(得分:3)

您的命令在DB2 10 for LUW中正常工作。数据工作室版本无关紧要,因为它与CLP的工作方式相同。 我在示例数据库中测试了这段代码:

BEGIN ATOMIC
 DECLARE UID char(30);
 SET UID = 200280;
 SELECT FIRSTNME, LASTNAME FROM ANDRES.EMPLOYEE WHERE EMPNO = UID;
END @

您正在使用的z / OS版本可能不支持内联SQL(Begin atomic)。我不是zOS DBA,我知道LUW,iSeries和zOS之间存在许多SQL差异。

请检查跨平台兼容性。这是一个非常好的博客来理解这个问题:https://www.ibm.com/developerworks/mydeveloperworks/blogs/SQLTips4DB2LUW/entry/crossplatformsqlrefv4?lang=en

答案 1 :(得分:2)

以下是您第一种情况的基本语法:

create variable id_var  integer;
create variable id_var1 integer;

set id_var = 100;

set id_var1 = (select id from t1 where id = id_var);

select * from t2 where id = id_var1;

但是,在此示例中,您尝试将变量用作列名:

CREATE VARIABLE UID CHAR(30) DEFAULT 'USERID'; 
select * from testdb2.T1 A WHERE A.UID=v_UID;
--some other activity goes here
--and here
DROP VARIABLE UID;

不幸的是,你不能在DB2中做到这一点。做这样的事情的唯一方法是建立一个dynamic sql statement并执行它。这有点乱:你在字符串中创建一个sql命令,然后准备并执行它。在动态sql中直接使用SELECT也有限制。最好考虑另一种能解决问题的设计,而不是走这条路。