我正面临着尝试理解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日)更新
创建存储过程是解决此问题的唯一方法:(
答案 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
也有限制。最好考虑另一种能解决问题的设计,而不是走这条路。