如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DB2 中执行 SQL 匿名块?

如何在java中执行复合sql查询?

在db2中,如何使用sql查询最新七天的数据

LINUX下shell脚本如何执行 sql脚本 到DB2数据库?

db2cmd如何执行sql文件并传递参数?

如何查看db2正在进行的sql执行状态