【发布时间】:2012-10-19 18:52:13
【问题描述】:
我在尝试理解 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
[编辑:使用声明] 我尝试过的另一件事不起作用:
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 日)更新
创建存储过程是解决此问题的唯一方法:(
【问题讨论】:
-
你想做什么,
JOIN不是一个选项?看看DB2 Reference - 我认为BEGIN ATOMIC只是触发器定义的一部分(这是你正在尝试的吗?)。如果您只是想在命令 shell 中执行此操作,那么它可能期待下一个DECLARE,尽管我认为这实际上并不是您想要的方式。你真正的问题是什么? -
@Clockwork-Muse 我只需要将 ID 存储在表 T1 中的变量中,然后在脚本的其余部分中使用该变量。稍后该脚本将成为存储过程,但现在我才刚刚开始,所以需要了解更多关于变量声明等的知识。
-
因此,在与 DBA 多次讨论之后,我意识到在这个版本的 DB2 for z/OS V9.1 中是不可能的。他建议我宁愿将其包装在存储的过程中,然后对其进行测试。如果可行,我会更新。
标签: sql db2 zos ibm-data-studio