如何将此 AS400 查询转换为我可以在 JDBC 连接的 DBMS 中 运行 的查询?
How can I convert this AS400 query to one I can run in a JDBC-connected DBMS?
我的办公室里有一台几乎没人知道的旧 AS400,还有一些与之交互的遗留程序。在查看某些程序时,我发现一个包含引起我注意的查询的文件。我擅长 SQL 使用 Oracle 数据库(我在数据仓库工作了几年,每天查询 Oracle 8 小时),但我没有使用 DB2(或 RPG/SQLRPGLE,我认为这是基于我的搜索)并且这个查询对我来说似乎完全陌生。这是查询(为了数据 security/anonymity 目的而略有改动):
SELECT
WDATA(CVTDATE(PRDADT,CYMD)) NAME(@PRDADT) COLHDG("Availability Date"),
WDATA(prdid.1) NAME(product) COLHDG("Product ID"),
prdsku.1 EDTCDE(4),
prcxif.2,
sum(prcval) NAME(@price) LEN(6,2)
FROM
mydb/prod T01,
mydb/pric,
mydb/vndr T02,
PARTIAL OUTER JOIN
prdid.1=prcid.2
and prdsku.1=prcsku.2
and prdid.1=vnid.3
WHERE
prdcbp=&CBP
and prdadt BETWEEN yymmdd(date("&&startdt")) AND yymmdd(date("&&enddt"))
GROUP BY
prdsku.1,
prcxif.2
ORDER BY
prdsku
我无法理解这里的某些内容。我发现 table 名称中的斜杠是 separate schema/table, cvtdate indicates we use a program/utility called Sequel Data Access, and EDTCDE appears to be a way to format output values 的 DB2 特定方式,但经过数小时的研究我仍然找不到某些问题的答案(主要是因为 Google 在大多数搜索中不解释符号):
- 求和字段后的 LEN(6,2) 是多少?我假设它做了某种 padding/rounding (比如最大长度或 6 位零填充长度,有两位小数)但任何时候我搜索 "len" Google 都会给我结果中包含 "length",或者我发现查询似乎只使用一个参数的函数来获取字符串的长度。
- 某些列名称上的“.#”后缀是什么?它没有在 ORDER BY 中使用,所以它看起来不像是在字段名称中;它看起来更像是引用列所属的 FROM 列表中的 table。但是,当使用另一个 DB2 数据库时,我不必为连接的 tables 做任何类似的事情,我只需在它们前面加上 table 名称,如 Oracle...还有每个列名称似乎使用了 table-specific 前缀所以我不知道为什么有必要识别 table.
- 什么是 &[text] 和 &&[text] 对象?我认为 &CBP 代表一个传递的参数,但我不知道为什么它有一个 & 符号,而 &&startdt 和 &&enddt 有两个;也许是一种转义字符,因为它们在引号中?
- WDATA 有什么作用?第二行 WDATA 行似乎在稍后(在条件中)使用之前将格式应用于列,但第一行似乎将 name/heading 应用于以后未返回或使用的列。
我相信这里的一些聪明人会看到这个查询并立即知道它的含义,但我完全不知道它是如何工作的,所以如果有人有任何见解,我会很高兴可以分享一下。
谢谢!
好吧,这不是现在称为 IBM i 的 RPG/RPGLE 或直接 SQL。
Sequel 是现在归 Help-systems 所有的第三方产品
https://www.helpsystems.com/product-lines/sequel
据我所知,这是一个不错的工具,但语法因产品而异。
我的一些有根据的猜测,在这个平台上有大约 25 年的经验,但没有使用 Sequel 产品的经验,同意你的想法。
- LEN(6,2) --> 调整结果列的大小。
cast (sum(prcval) as numeric(6,2))
- .# --> 别名 table
的奇怪方式
- &[text], &&[text] --> 传入参数,&&因为双引号转义了。
WDATA
是唯一的难点...谷歌搜索似乎表明它用于包含 "main" 结果屏幕中未显示的 "hidden" 列。可能用在一个header/filter的页面上?
我的办公室里有一台几乎没人知道的旧 AS400,还有一些与之交互的遗留程序。在查看某些程序时,我发现一个包含引起我注意的查询的文件。我擅长 SQL 使用 Oracle 数据库(我在数据仓库工作了几年,每天查询 Oracle 8 小时),但我没有使用 DB2(或 RPG/SQLRPGLE,我认为这是基于我的搜索)并且这个查询对我来说似乎完全陌生。这是查询(为了数据 security/anonymity 目的而略有改动):
SELECT
WDATA(CVTDATE(PRDADT,CYMD)) NAME(@PRDADT) COLHDG("Availability Date"),
WDATA(prdid.1) NAME(product) COLHDG("Product ID"),
prdsku.1 EDTCDE(4),
prcxif.2,
sum(prcval) NAME(@price) LEN(6,2)
FROM
mydb/prod T01,
mydb/pric,
mydb/vndr T02,
PARTIAL OUTER JOIN
prdid.1=prcid.2
and prdsku.1=prcsku.2
and prdid.1=vnid.3
WHERE
prdcbp=&CBP
and prdadt BETWEEN yymmdd(date("&&startdt")) AND yymmdd(date("&&enddt"))
GROUP BY
prdsku.1,
prcxif.2
ORDER BY
prdsku
我无法理解这里的某些内容。我发现 table 名称中的斜杠是 separate schema/table, cvtdate indicates we use a program/utility called Sequel Data Access, and EDTCDE appears to be a way to format output values 的 DB2 特定方式,但经过数小时的研究我仍然找不到某些问题的答案(主要是因为 Google 在大多数搜索中不解释符号):
- 求和字段后的 LEN(6,2) 是多少?我假设它做了某种 padding/rounding (比如最大长度或 6 位零填充长度,有两位小数)但任何时候我搜索 "len" Google 都会给我结果中包含 "length",或者我发现查询似乎只使用一个参数的函数来获取字符串的长度。
- 某些列名称上的“.#”后缀是什么?它没有在 ORDER BY 中使用,所以它看起来不像是在字段名称中;它看起来更像是引用列所属的 FROM 列表中的 table。但是,当使用另一个 DB2 数据库时,我不必为连接的 tables 做任何类似的事情,我只需在它们前面加上 table 名称,如 Oracle...还有每个列名称似乎使用了 table-specific 前缀所以我不知道为什么有必要识别 table.
- 什么是 &[text] 和 &&[text] 对象?我认为 &CBP 代表一个传递的参数,但我不知道为什么它有一个 & 符号,而 &&startdt 和 &&enddt 有两个;也许是一种转义字符,因为它们在引号中?
- WDATA 有什么作用?第二行 WDATA 行似乎在稍后(在条件中)使用之前将格式应用于列,但第一行似乎将 name/heading 应用于以后未返回或使用的列。
我相信这里的一些聪明人会看到这个查询并立即知道它的含义,但我完全不知道它是如何工作的,所以如果有人有任何见解,我会很高兴可以分享一下。
谢谢!
好吧,这不是现在称为 IBM i 的 RPG/RPGLE 或直接 SQL。
Sequel 是现在归 Help-systems 所有的第三方产品 https://www.helpsystems.com/product-lines/sequel
据我所知,这是一个不错的工具,但语法因产品而异。
我的一些有根据的猜测,在这个平台上有大约 25 年的经验,但没有使用 Sequel 产品的经验,同意你的想法。
- LEN(6,2) --> 调整结果列的大小。
cast (sum(prcval) as numeric(6,2))
- .# --> 别名 table 的奇怪方式
- &[text], &&[text] --> 传入参数,&&因为双引号转义了。
WDATA
是唯一的难点...谷歌搜索似乎表明它用于包含 "main" 结果屏幕中未显示的 "hidden" 列。可能用在一个header/filter的页面上?