如何以编程方式在 as400 上运行复杂查询



我是处理 as400 的新手,我有一个跨 4 个表的连接查询。查询本身很好,它在 STRSQL 中运行并显示结果。

我正在努力解决的是使查询能够以编程方式运行(它最终将从计划的 CL 脚本运行)。

我尝试创建一个物理文件,其中包含使用 RUNQRY 运行的查询,但它只显示查询本身,而不是实际的结果集。

有谁知道我做错了什么?

<小时 />

更新

感谢大家的方向和资源,有了他们,我能够实现我的目标。如果它对任何人有帮助,这就是我最终所做的(所有这些都是在它自己的库 ALLOCATE 中完成的):

  1. 创建了一个源物理文件(使用 CRTSRCPF):QSQLSRC,并创建了一个名为 SQLLEAGSEA 的成员,其类型为 TXT,其中包含 SQL 语句。

  2. 创建了另一个源物理文件:QCLSRC,并创建了一个名为 POPLEAGSEA 的成员,其类型为 CLP,该成员将当前库更改为 ASSIGN ,然后使用 RUNSQLSTM 运行查询(下面将详细介绍)。这是实际命令:

    RUNSQLSTM SRCFILE(QSQLSRC) SRCMBR(SQLLEAGSEA) COMMIT(*NONE) NAMING(*SYS)

  3. 将 CLP 添加到计划作业(使用 ADDJOBSCDE)中,运行以下命令:

呼叫PGM(分配/波普利格西)

关于 RUNSQLSTM,我的研究表明我无法使用这个函数,因为它不支持 SELECT 语句。我在问题中没有指出的是我需要对结果做什么 - 我将把结果数据插入到另一个表中(如果我这样做了,我相信帮助可以更快地解决这个问题)。如此有效地,我不会做一个选择,我的最终结果实际上是一个插入。所以我的SQL语句(在SQLLEAGSEA中)的开头是:

插入到 分配/利格海

选择 ... 等等等等 ...

根据我的研究,我发现 RUNSQLSTM 不支持 SELECT,因为它没有对结果做任何事情的机制。一旦我停止采取婴儿步骤并意识到我需要在同一语句中选择和插入,它就解决了我的主要问题。

再次感谢大家!

该命令RUNSQLSTM在物理文件成员或流文件中运行静态 SQL 语句。

它是一个非交互式命令,因此它不会执行尝试返回结果集的 sql 语句。

如果需要更多控制,包括运行交互式语句的能力,请参阅 Qshell db2 实用程序。

例如:

QSH CMD('db2 -f /QSYS.LIB/MYLIB.LIB/MYSRCFILE.FILE/MYSQL.MBR')

请注意,db2实用程序仅接受 *SQL 命名约定。

QM 查询

如果您所需要的只是单个复杂的 SQL 语句,并且听起来就是这样,那么最好的选择是使用查询管理查询(请参阅此处的 QM 查询手册)。

结果可以定向到显示、假脱机文件或物理文件(即 DB2 表)。以交互方式运行时的默认输出是屏幕,但在(计划的)批处理作业中运行时,它将默认为假脱机文件报告。

您可以通过WRKQMQRY以交互方式创建 QM 查询,在提示模式(与 Query/400 非常相似)或 SQL 模式下。 或者,您可以使用CRTQMQRY命令从源代码编译 QM 查询。
要运行 QM 查询,STRQMQRY命令。

RUNSQL cmd

如果您使用的系统具有完全最新的 IBM i 7.1,并且安装了技术更新 4 (TR4),那么您还可以使用新的RUNSQL命令来执行单个语句。(参见 developerWorks 中的讨论)

SQL Scripting w/RUNSQLSTM cmd

从 CL 中,您可以从源文件成员运行多个 SQL 语句的 SQL 脚本。 没有标准的默认源文件名,但通常使用 QSQLSRC。 源成员可以包含多个非交互式 SQL 语句。 这意味着您不能(直接)使用 SELECT 语句,因为理论上它不知道将结果发送到哪里。如果给定CL:前缀,甚至允许使用 CL 命令。 SQL 和 CL 语句都应以分号;结尾。 虽然 SQL 语句不能直接向屏幕显示数据,但相同的限制不适用于脚本化的 CL 命令。

STRQMQRY命令可以嵌入到RUNSQLSTM脚本中,方法是在命令前面放置前缀"CL:"。 由于 STRQMQRY 可以将输出定向到屏幕、报告或输出表,因此非常有用。

请记住,要将输出从 SELECT 查询定向到文件,可以使用 INSERT 或 CREATE TABLE 语句。

CREATE TABLE newtbl AS
( full-select )
WITH DATA;

或者,要将结果放入您在作业的 QTEMP 库中创建的表中,请执行以下操作:

DECLARE GLOBAL TEMPORARY TABLE AS
( full-select )
WITH DATA;

[注意:如果创建CRTQMQRY要使用的源,建议将其创建为CRTSRCPF yourlib/QQMQRYSRC RCDLEN(91),因为编译器将仅使用源数据的79列(添加12为序列和更改日期=91)。 但是,对于可用于提供额外格式的 QM 表单,CRTQMFORM编译器将使用 81 列,因此建议使用 QQMFORMSRCRCDLEN(93)

RUNQRY 是一个实用程序,可让您执行由另一个名为 WRKQRY 的实用程序创建的查询。 如果你真的想处理文件中保存的SQL语句,请尝试RUNSQLSTM。 它使用源物理文件而不是数据库文件来存储语句。 该源物理文件的标准名称是 QQMQRYSRC。 要创建该文件,CRTSRCPF yourlib/QQMQRYSRC。 然后,您可以使用 PDM 来处理该源 PF。 WRKMBRPDM yourlib/QQMQRYSRC. 使用 F6 创建新的源成员。 使其成为源类型 TXT。 然后使用选项 2 启动一个名为 SEU 的编辑器。 将 SQL 语句复制/粘贴到此编辑器中。 按 F3 键保存源。 保存源代码后,使用 RUNSQLSTM 执行它。

(现在)可以直接在CL程序中运行SQL,而无需使用QM Query,RUNSQLSTM或QShell。

这是一篇讨论 CL 程序中的 RUNSQL 语句的文章...

http://www.mcpressonline.com/cl/the-cl-corner-introducing-the-new-run-sql-command.html

本文包含有关支持哪些操作系统级别的信息,以及使用 RUNSQL 语句的几种方法的清晰示例。

这将分两步工作:

RUNSQL SQL('CREATE TABLE QTEMP/REPORT AS (SELECT +         
EXTRACT_DATE , SYSTEM, ODLBNM, SUM( +              
OBJSIZE_MB ) AS LIB_SIZE FROM +                    
ZSYSCOM/DISKRPTHST WHERE ODLBNM LIKE +             
''SIS%'' GROUP BY EXTRACT_DATE, SYSTEM, +          
ODLBNM ORDER BY LIB_SIZE DESC) WITH +              
DATA') COMMIT(*NONE) DATFMT(*USA) DATSEP(/)        
RUNQRY     QRYFILE((QTEMP/REPORT)) OUTTYPE(*PRINTER) +          
OUTFORM(*DETAIL) PRTDFN(*NO) PRTDEV(*PRINT)        

第一步在 qtemp 中创建一个临时表结果,第二步/行仅对临时表运行临时查询到假脱机文件。

谢谢 迈克尔·弗里洛特

当然,还有一个完全不同的解决方案:您可以编写和编译一个包含该语句的程序。它需要更长的阅读时间,特别是如果你是该平台的新手,但它应该给你最大的灵活性来处理结果。你可以在C,C++,RPG,RPG/LE,REXX,PL(我不知道它是什么)和COBOL中使用SQL。这样做,您可以以任何可处理的方式对一个查询的结果做出反应,并根据您获得的内容启动/创建其他查询。

尽管一些老式的RPG程序员想尽一切办法否认RPG中的SQL存在,但今天在许多情况下,编写RPG程序是可能的,只有SQL而没有直接的文件访问(对于那些了解RPG的人来说,没有F-Specs)。

如果您的解决方案适合您,那就完美了。如果您需要执行其他操作,请尝试查看此pdf:http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/rzajp/rzajp.pdf

与RPG的集成还不错。它适用于正常的程序流。看起来像这样(自由形式):

/free
// init search values:
searchval = 'Someguy';
// so the sql query:
exec sql
SELECT colum1, colum2
INTO :var1, :var2
FROM somelib/somefile
WHERE keycol=:searchval;
// now do something with the values:
some_proc(var1);
/end-free

在这里,var1var2searchval是普通的RPG变量。无需报价。也适用于数据结构(外部定义,例如,文件本身的记录格式非常适合)。当然,您也可以使用光标和循环。我觉得RPG程序往往更容易阅读。

最新更新