如何将此AS400查询转换为可在JDBC连接的DBMS中运行的查询?

时间:2017-07-03 13:28:00

标签: sql db2 ibm-midrange

我们办公室里有一台旧的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似乎是{{3但经过数小时的研究后,我仍然无法找到一些问题的答案(主要是因为谷歌在大多数搜索中都没有解释符号):

  • 总和字段后的LEN(6,2)是什么?我假设它做某种填充/舍入(如最大长度或零填充长度的6位数,有两个小数位)但任何时候我搜索" len"谷歌给我的结果是"长度"在它们中,或者我发现似乎只使用一个参数来获取字符串长度的函数的查询。
  • 什么是"。#"某些列名称的后缀?它没有在ORDER BY中使用,所以它看起来并不像在字段名称中那样;它看起来更像是引用列所属的FROM列表中的哪个表。但是,当玩另一个DB2数据库时,我不必对连接表做任何类似的操作,我只是在它们前面加上像Oracle这样的表名...而且每个列名似乎都使用特定于表的前缀所以我不知道为什么有必要识别表格。
  • 什么是& [text]和&& [text]对象?我认为& CBP代表了一个通过的参数,但我不知道为什么它有一个&符号而&& startdt和&& enddt有两个;也许是一种逃避角色,因为那些是引号?
  • WDATA做什么?第二个WDATA行似乎在稍后使用(在条件中)之前将一个格式应用于列,但第一个似乎将名称/标题应用于以后不返回或使用的列。

我确信这里有一些聪明的头脑会看到这个问题并立即知道这意味着什么,但我完全不知道它是如何运作的,所以如果有的话我会很喜欢它任何见解都可以分享。

谢谢!

1 个答案:

答案 0 :(得分: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是唯一的绊脚石......一些谷歌搜索似乎表明它已经过去包含了#34;隐藏"不会在" main"中显示的列结果屏幕。可能在页面上的标题/过滤器中使用?