我想在IBM System I Navigator工具中使用我声明的变量运行一些ad hoc select语句。
例如,在SQL Server世界中,我很容易在SQL Server Management Studio查询窗口中执行此操作,如下所示:
DECLARE @VariableName varchar(50);
SET @VariableName = 'blah blah';
select * from TableName where Column = @VariableName;
如何在IBM System I Navigator工具中执行类似操作?
答案 0 :(得分:7)
我在搜索同一个问题时遇到过这篇文章。我的同事提供了答案。确实可以在Navigator中的ad hoc SQL语句中声明变量。这就是它的完成方式:
CREATE OR REPLACE VARIABLE variableName VARCHAR(50);
SET variableName = 'blah';
SELECT * FROM table WHERE column = variableName;
DROP VARIABLE variableName;
如果您不删除变量名称,它将会挂起,直到谁知道...
答案 1 :(得分:1)
目前,我们正在处理同样的问题。不幸的是,我们得出结论认为这是不可能的。我同意,它会很棒,但它不会那样工作。 iNavigator不支持SET或Define。您可以在嵌入式SQL中执行此操作,但这不是嵌入式SQL。即使您创建了一个单独的文档(xxx.sql),也需要打开此文档来运行脚本,使其成为一个交互式脚本(即不允许使用DECLARE SECTION)。
作为替代方案,在SQL屏幕/脚本中,您可以使用 CL:。此前缀之后的任何内容都作为CL命令执行。你可以用这种方式操纵你的表格(例如RNMF)。
作为第二种选择,iSeries支持Rexx脚本(默认情况下与os一起安装)。 Rexx是一种很好的动态脚本语言,它支持嵌入式SQL。我做了很多次,效果很好。我甚至为我们的生产环境创建了脚本。
只需使用示例PREPARE和CURSOR语句创建一个“默认”脚本,然后随意复制。有了这个脚本,你可以玩。有关exec-sql的正确语法,请参阅Rexx手册。此外,您确实有STDIN和STDOUT,但您可以使用'OVRDBF'指向数据库表(物理文件)。如果您需要示例Rexx脚本,请告诉我。
请注意,手册“SQL嵌入式编程”确实有Rexx示例。
答案 2 :(得分: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上的数据交互的其他一些方法:使用Python通过ODBC从客户端进行查询;通过JDBC从Jython客户端查询;直接在iSeries上安装Jython,然后通过JDBC进行查询。