4

我在尝试理解 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

这一切都在那里运行良好,并为我提供了一个对应于 ID1 的 ID,该 ID 可进一步用于从 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 日)更新

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

4

2 回答 2

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

于 2012-10-21T02:23:05.040 回答
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 中做到这一点。这样做的唯一方法是构建动态 sql 语句并执行它。这有点乱:您在字符串中创建一个 sql 命令,然后准备并执行它。SELECT并且在动态sql中直接使用也有限制。最好考虑另一种设计来解决您的问题,而不是沿着这条路线走。

于 2012-10-22T08:43:16.387 回答