IBM i (iSeries)视图点脚本



我正试图将当前存储在视点中的内容作为运行并将其转换为SQL和计划任务的脚本。我的问题很简单,我不知道I系列中使用的脚本语言。有人能告诉我结果值是多少吗&STARTS2和&STARTS3

CHGVAR VAR(&OFFSET) VALUE(0)
CHGVAR VAR(&STARTS) VALUE(CYYMMDD(DATE(MONTH(Current Date- (&OFFSET + 1) Month)||'/22/'||YEAR(Current Date-(&OFFSET+1) month))))
CHGVAR VAR(&STARTS2) VALUE(CYYMMDD(DATE(MONTH(Current Date- (&OFFSET + 2) Month)||'/22/'||YEAR(Current Date-(&OFFSET+2) month))))
CHGVAR VAR(&STARTS3) VALUE(CYYMMDD(DATE(MONTH(Current Date- (&OFFSET + 3) Month)||'/22/'||YEAR(Current Date-(&OFFSET+3) month))))

关于iSeries的一个相对有趣的事情是它允许您进行"自然语言"日期数学:current_date - 2 months正是它的名字,正好是今天之前两个月的日期。

那么,假设它实际上像写的那样工作,这个脚本所做的是:

  • 设置变量&OFFSET为0。(CHGVAR命令是iSeries的冗长的赋值方式:在大多数语言中,你会写&OFFSET = 0代替,甚至在iSeries中,你可以将其缩短为CHGVAR &OFFSET 0。)
  • 将变量&STARTS设置为上个月的22日,其中日期采用CYYMMDD格式。(它通过基于"使用比今天早一个月的月份,22作为日,以及比今天早一个月的月份的年份"构造日期,然后将其转换为CYYMMDD格式来实现这一点。
  • 将变量&STARTS2设置为2个月前的22日
  • 将变量&STARTS3设置为3个月前的22日

如果你要调整&OFFSET的值(通过改变它的VALUE(0)赋值),你计算的日期将是更早的过去:将其设置为VALUE(4)将得到你的日期5、6和7个月前。

顺便说一下,在CYYMMDD格式中,'C'是1900年以来的世纪计数器;实际上,日期是一个格式为YYYYMMDD - 19000000的整数。因此,1/1/1999 = YYYYMMDD格式的19990101,或CYYMMDD格式的0990101;12/31/2011 = YYYYMMDD格式的20111231,或CYYMMDD格式的1111231。

所以如果你今天运行这个,8/19/2015,你应该得到的结果是:

  • &STARTS = 1150722
  • &STARTS2 = 1150622
  • &STARTS3 = 1150522
顺便说一下,编写脚本所用的语言称为"CL"("Command language"的缩写),官方语言参考位于IBM Knowledge Center。

谁能告诉我&STARTS的结果值是多少&STARTS2和&STARTS3

TL;DR:结果值将是未定义的,因为只有第一个CHGVAR命令可以编译。其他人有很多问题。作为伪代码,这些语句没有问题,但是当它们被表示为实际的CL语句时,它们将扩展成一大块代码。

细节:

一个潜在的问题是将CL视为一种"脚本语言"。虽然它当然可以并且通常用于"脚本",但它是系统的"控制语言"。就"脚本"而言,对于一个优秀的C程序员来说,用C代替CL作为"脚本"语言是很容易的。同样地,我也看到许多RPG开发者在RPG中编写了许多"脚本"。对于COBOL也是如此。

CL也是系统的"命令语言"。在当前支持的操作系统版本中,您可以找到近2000个命令。许多系统功能只能通过命令,或通过调用或调用执行命令的程序来完成。通过将命令字符串传递给系统的命令处理api之一,每种本地语言都可以交互式地执行大多数命令。即使是编译语言CL,也可以像其他语言一样交互式地执行命令。

仍然编译CL。它也可以完全作为一种ILE语言参与进来,尤其是从操作系统的V5R4版本开始,但从技术上讲,ILE是在as/400系列中首次引入的。

作为ILE参与者,CL可以完全访问其他本地语言具有的相同特性。例如,CL可以使用C运行时函数库。因此,除了本地CL命令功能之外,它基本上可以做ILE RPG可以做的任何事情。您甚至可以编译CL *模块并将它们绑定在一起以创建服务程序(想想Windows . dll或UNIX函数库)。

但是CL没有一个SQL预处理器。

虽然有一些用于执行交互式SQL语句的命令,但没有工具可以执行像VALUES INTO或从游标中抓取或从SQL函数(如DATE())中获取结果之类的操作。

。从技术上讲,我想我们可以说这是可以做到的,因为它毕竟是"ILE CL"。因此,CL可以调用各种SQL CLI api(比如ODBC)。因此,您可以通过调用SQLAllocEnv()、SQLAllocConnect()、SQLConnect()、SQLPrepare()以及可能需要的所有其他函数来编写CL过程。

但是您不能在CL中做的事情与您想在最后三个CHGVAR命令的VALUE()参数中做的事情类似。当然可以编写CL过程来执行日期计算和操作。与早期的其他人一样,在各种日期/时间api易于访问之前,我用CL(以及其他语言)编写了各种详细的日期数学函数。然后,在api中,大多数都被更优雅的api所取代。

CL可以说是系统上最复杂的语言。但它不做SQL。至少不像C、RPG或COBOL那样。CL是一种"控制"语言,既不是数据库语言,也不是应用程序语言。

还有另一种选择。有一种本地的"脚本"语言可以运行SQL——REXX。使用REXX要比使用CL容易得多。您的VALUE()子句几乎可以被解除并直接粘贴到适当的REXX过程中。可以使用CL包装器为每个复杂的VALUE()参数调用过程,并从REXX中提取结果。或者您可以让REXX同时完成这三个任务。

相关内容

  • 没有找到相关文章

最新更新