5

我想使用我声明的变量在 DB2 的 IBM System I Navigator 工具中运行一些特别选择语句。

例如,在 SQL Server 世界中,我可以在 SQL Server Management Studio 查询窗口中轻松执行此操作,如下所示:

DECLARE @VariableName varchar(50);
SET @VariableName = 'blah blah';

select * from TableName where Column = @VariableName;

如何在 IBM System I Navigator 工具中执行类似操作?

4

3 回答 3

9

我在搜索相同的问题时遇到了这篇文章。我的同事给出了答案。确实可以在 Navigator 的即席 SQL 语句中声明变量。这是这样做的:

CREATE OR REPLACE VARIABLE variableName VARCHAR(50);
SET variableName = 'blah';
SELECT * FROM table WHERE column = variableName;
DROP VARIABLE variableName;

如果您不删除变量名,它将一直存在,直到谁知道什么时候...

于 2010-12-15T14:49:50.923 回答
1

目前,我们正在工作中处理相同的问题。不幸的是,我们得出的结论是这是不可能的。我同意,这会很棒,但它只是不能那样工作。iNavigator 不支持 SET 或 Define。您可以在嵌入式 SQL 中执行此操作,但这不是嵌入式 SQL。即使你创建了一个单独的文件(xxx.sql),那么也需要打开这个文件来运行脚本,使它成为一个交互式脚本(也就是说,DECLARE SECTION 是不允许的)。

作为替代方案,您可以在 SQL 屏幕/脚本中使用CL:。此前缀之后的任何内容都作为 CL 命令执行。您可以通过这种方式操作您的表格(例如 RNMF)。

作为第二种选择,iSeries 确实支持 Rexx 脚本(默认与操作系统一起安装)。Rexx 是一种很好的动态脚本语言,它确实支持嵌入式 SQL。我已经做过很多次了,而且效果很好。我什至为我们的生产环境创建了脚本。

只需使用示例 PREPARE 和 CURSOR 语句创建一个“默认”脚本并随意复制。使用该脚本,您可以玩耍。有关 exec-sql 的正确语法,请参阅 Rexx 手册。此外,您确实有 STDIN 和 STDOUT,但您可以使用 'OVRDBF' 指向数据库表(物理文件)。如果您需要示例 Rexx 脚本,请告诉我。

请注意,手册“SQL 嵌入式编程”确实包含 Rexx 示例。

于 2010-03-01T15:56:16.547 回答
0

这里有几个其他的选择。

数据传输工具 - 您可以从命令行 (RTOPCB) 运行 iSeries 数据传输工具。首先,运行 GUI 版本并创建定义文件。如果您使用文本编辑器编辑此文件,您将看到这只是一个老式的 INI 文件,您可以轻松找到其中包含查询的行。从那里,您可以编写一个批处理文件或以其他方式预处理文本文件,以允许您在将查询提交到查询工具之前对其进行操作。

QSHELL - 如果您可以交互式登录到 iSeries,那么您可能会发现 QSHELL 环境比 CL 或 REXX 更熟悉(尽管 REXX 很有趣)。QSHELL 是在 iSeries 上运行的完整 POSIX 环境。使用命令 STRQSH 启动 QSHELL。您可以将 ksh 或 csh 作为 shell。在 QSHELL 内部,有一个名为“db2”的命令用于提交查询。所以,你应该能够在 QSHELL 中做这样的事情:

system> VariableName = 'blah blah'
system> db2 "select * from TableName where Column = \'$VariableName\'"

您可能必须摆弄引号才能让 ksh 正确传递它们。

此外,在 QSHELL 中,您应该有一个完整的 Perl 安装,允许您使用 DBI 获取数据。

与 iSeries 上的数据交互的其他一些方式:通过 ODBC 从客户端使用 Python 进行查询;通过 JDBC 使用 Jython 从客户端查询;直接在 iSeries 上安装 Jython,然后通过 JDBC 查询。

于 2010-03-28T03:21:16.770 回答