如何在 DB2 中执行复合 sql
Posted
技术标签:
【中文标题】如何在 DB2 中执行复合 sql【英文标题】:How to execute compound sql in DB2 【发布时间】: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 中是不可能的。他建议我宁愿将其包装在存储的过程中,然后对其进行测试。如果可行,我会更新。
【参考方案1】:
您的命令在 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
【讨论】:
这也可以帮助(有点老)ibm.com/developerworks/data/library/techarticle/db2common【参考方案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
也有限制。最好考虑另一种设计来解决您的问题,而不是沿着这条路线走。
【讨论】:
以上是关于如何在 DB2 中执行复合 sql的主要内容,如果未能解决你的问题,请参考以下文章