我面临着一个挑战,试图理解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,可以进一步使用T2。
。可悲的是,在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用于z/os v9.1IBM 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,Abhinav
更新2016年5月13日(13日,星期五)
创建存储的proc是解决此问题的唯一方法:(
您的命令在LUW中在DB2 10中正常工作。数据工作室版本无关紧要,因为它可以从CLP使用相同。我在示例数据库中测试了此代码:
BEGIN ATOMIC
DECLARE UID char(30);
SET UID = 200280;
SELECT FIRSTNME, LASTNAME FROM ANDRES.EMPLOYEE WHERE EMPNO = UID;
END @
可能,您正在使用的Z/OS版本不支持内联SQL(开始原子)。我不是ZOS DBA,我知道Luw,Iseries和Zos之间存在许多SQL差异。
请检查跨平台兼容性。这是一个非常好的博客,可以理解问题:https://www.ibm.com/developerworks/mydeveloperworks/blogs/sqltips4db2luw/entry/crossplatformsqlrefv4?
这是您第一种情况的基本语法:
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命令,然后准备并执行它。并且在动态SQL中直接使用了SELECT
的限制。最好想到另一个可以解决您的问题的设计,而不是走这条路线。