【问题标题】:How can I convert this AS400 query to one I can run in a JDBC-connected DBMS?如何将此 AS400 查询转换为可以在连接 JDBC 的 DBMS 中运行的查询?
【发布时间】:2017-07-03 13:28:00
【问题描述】:

我的办公室有一台几乎没人知道的旧 AS400,还有一些与之交互的旧程序。在查看一些程序时,我发现了一个包含引起我注意的查询的文件。我在使用 Oracle 数据库时擅长 SQL(我在数据仓库工作了几年,每天 8 小时查询 Oracle),但我没有使用 DB2(或 RPG/SQLRPGLE,我认为这是基于我的搜索),这个查询对我来说似乎完全陌生。以下是查询(出于数据安全/匿名的目的略有改动):

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

我无法理解这里的一些内容。我已经收集到表名中的斜杠是separate schema/table 的 DB2 特定方式,cvtdate 表示我们使用名为 Sequel Data Access 的程序/实用程序,EDTCDE 似乎是format output values 的一种方式,但在几个小时后的研究我仍然找不到一些问题的答案(主要是因为谷歌在大多数搜索中不解释符号):

  • 求和字段后的 LEN(6,2) 是什么?我认为它会进行某种填充/舍入(如最大长度或 6 位的零填充长度,带两位小数),但每当我搜索“len”时,Google 都会给我包含“长度”的结果,或者我发现查询似乎使用只有一个参数的函数来获取字符串的长度。
  • 某些列名上的“.#”后缀是什么?它没有在 ORDER BY 中使用,因此看起来它实际上并不在字段名称中;它看起来更像是引用该列所属的 FROM 列表中的哪个表。但是,当使用另一个 DB2 数据库时,我不必为连接的表做任何类似的事情,我只需在它们前面加上 Oracle 之类的表名......而且每个列名似乎都使用一个特定于表的前缀,所以不知道为什么要识别表。
  • 什么是 &[text] 和 &&[text] 对象?我认为 &CBP 代表一个传递的参数,但我不知道为什么它有一个 & 符号而 &&startdt 和 &&enddt 有两个;也许是一种转义字符,因为它们是用引号引起来的?
  • WDATA 做什么?第二个 WDATA 行似乎在稍后使用之前将格式应用于列(在条件中),但第一行似乎将名称/标题应用于稍后未返回或使用的列。

我相信这里的一些聪明人会看到这个查询并立即知道它的含义,但我完全不知道它是如何工作的,所以如果有任何见解的人可以分享,我会很高兴它。

谢谢!

【问题讨论】:

    标签: sql db2 ibm-midrange


    【解决方案1】:

    这不是现在称为 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))
    • .# --> 一种奇怪的表别名方式
    • &[text], &&[text] --> 传入参数,&& 因为双引号而转义。

    WDATA 是唯一的绊脚石......有点谷歌搜索似乎表明它用于包含未显示在“主”结果屏幕中的“隐藏”列。可能在页面上的标题/过滤器中使用?

    【讨论】:

    • 您实际上帮助我解决了这个问题,告诉我它不是 DB2 的一部分 - 我认为 Sequel Data Access 是一个功能包,但我没有意识到它是自己的报告软件。我去查看了专门针对 Sequel Data Access 的文档,并在 static.helpsystems.com/sequel/web-manuals-help/… 找到了我所有四个问题的答案。
    • 还为将来遇到此问题的任何人添加,这里是上面 PDF 中的答案和相关位置: * LEN 调整字段大小并修剪小数位(第 53 页底部) * WDATA是“工作数据”,允许在 Sequel Data Access 中修改或使用数据,而无需在结果集中返回(第 52 页底部) *“column.#”字段限定类似于“table.column”的别名 -在我使用的查询中,实际上没有必要,因为列的名称不同(第 6 页) * 变量是 &name 或 &&name 转义(第 120 页,#9)
    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2015-06-07
    • 2014-12-26
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多