OVRDBF通俗点理解就是对文件创建一个快捷方式,最简单的一个Example:
OVRDBF FILE(SX)
TOFILE(QTEMP/FILEA),这句话意思是说我现在定义了一个虚拟的file,名字叫SX
,如果这时候我在command line 里
runqry *N SX,就可以查询到QTEMP/FILEA 的数据,不过这里需要注意,一般ovrdbf新起的名字最好和原来的File名字相同,尽管CL或者STRSQL/RUNSQL能识别SX并且编译通过,但是RPG程序编译时候是只去library list里找是否存在的,瞎起名字会导致编译不过也不方便理解。不过如果你认为OVRDBF就是这个简单功能,那就错了,请继续往下看。OVRDBF的实战应用:
1> 指定用特定library的File, 程序一般默认是从librarylist里面从上往下拿file,如果ovrdbf指定了特定的library,以ovrdbf 指定的library 为准。
2>指定特定Member,CL 或者RPG程序,默认拿数据都是拿file 的第一个member数据,一个常用的场景譬如log file里按日期member存放每天的数据,那如果想要抓取历史数据,OVRDBF就即刻能派上用场。
3> 更改代码日期,有时候需要sync 代码或者更改代码,不要心改错了行保存后,代码后面的日期就变了。 欺辱如下source Code &A
其实是有办法可以改成自己想要的日期的,步骤如下:先OVRDBF 指定source
file,library,还有member(Source 也是Fiile,可以用)
OVRDBF FILE(XB) TOFILE(&LIB/&FILE) MBR(&A)
,接下来runqry 检查下:
RUNQRY *n &A
然后用sql去更新字段SRCDAT,就成功率了。
UPDATE FIGUTL/XB SET SRCDAT = 888888 WHERE SRCSEQ =1
4>
程序么末尾务必需要使用DLTOVR,避免影响其余作业
程序么末尾务必需要使用DLTOVR,避免影响其余作业
程序么末尾务必需要使用DLTOVR,避免影响其余作业
**********************************************
再来说到
OPNQRYF,
一般常用功能就是对数据进行临时的筛选,举个例子譬如参数填写如下表示筛选今天的数据,
QRYSLT('FieldA *EQ 20190411'),那么为什么常用的程序需要在前面加个OVRDBF with parameter OVRSCOPE(*JOB) SHARE(*YES) 呢?
1> 其实如果OPNQRYF筛选出来的数据只在当前程序使用,是完全不需要以上参数的。因为OPNQRYF筛选出来的数据,默认只在当前程序下生效。但是如果程序A call到了程序B, 程序B也想要用A opnqryf之后的数据,那么就需要指定OVRSCOPE(*JOB) SHARE(*YES),这个意思就是说当File的打开路径发生更改了之后,当前作业下面的所有程序都用同样的路径去拿数据,那么这时候程序B也能拿到筛选之后的数据,SHARE 这个参数是CRTPF的一个参数,一般默认是*NO.如果你create file 时候指定了*YES,那么OVRDBF也无需指定这个参数。
2> 至于OVRSCOPE,这个就涉及到Active Group ,首先Group就是一组资源的集合,大家create program时候会看到这个,同一个Group下面的资源是可以有权限快速调用,如果程序A的Group和程序B的Group不是同一个,并且当前opnqryf或者OVRDBF用的activegroup 类型,那么就算share了open path,程序B同样无法用筛选后的数据.
3>
程序末尾记得用CLOF给关掉OPNQYRF!
程序末尾记得用CLOF给关掉OPNQYRF!
程序末尾记得用CLOF给关掉OPNQYRF!
Group更多的理解,可以参考以下内容以及出处
http://blog.chinaunix.net/uid-23233442-id-3384535.html
活动组(Activation Group)
活动组是一个作业的子结构,由系统资源组成,例如:存储器、提交机制、文件打开、重定向文件(Override files)。这些资源被分配给活动组以运行一个或者多个ILE或者是OPM程序。活动组使得我们可以在一个作业中相对独立地运行一些程序,而这些程序之间不会互相影响(如:Commitment Control & Overrides)。
一个程序所属的活动组是在编译它(CRTPGM & CRTSRVPGM)的时候指定的,但是OPM程序只能运行在默认的活动组中,不能改变。如果使用CRTBNDRPG来编译程序,那么只有在DFTACTGRP的值为*NO时才可以指定ACTGRP,DFTACTGRP的默认值是*YES,此时程序就运行在DFTACTGRP中。
活动组可以选以下几种值:
1. a named activation group
一个指定名称的活动组可以将您的ILE程序和服务程序作为一个整体来管理。这样的一个活动组是在第一个属于该组的程序被调用的时候被建立。
用户可以使用了RCLACTGRP命令删除一个活动组。但是,必须是在这个活动组没有被使用的时候才能被删除。
2.*NEW
如果我们为ACTGRP指定了*NEW,那么这个程序在任何被调用的时候都会重新生成一个新的活动组, 系统会自动为这个ACTGRP指定一个在这个JOB中唯一的一个名称。
一个以*NEW方式产生的活动组总是在生成它的那个程序结束时被系统自动删除(无论这个程序是不是以*INLR=*ON的方式退出的)。因此,如果你想使用*INLR=*OFF的方式结束一个程序,以便保持这个程序仍为Active 状态,那么你就不应该为此程序在ACTGRP参数指定*NEW。
注意:*NEW对于SERVICE PROGRAM是不适用的。SERVICE PROGRAM只能使用Named group or *CALLER。CRTPGM的ACTGRP默认值是*NEW。CRTBNDRPG的默认值是DFTACTGRP。
3.*CALLER
此参数将使得被调用的程序被激活在调用它的那个程序所属的活动组中。
对于OPM程序来说,它只能运行在*DFTACTGRP中。在以下两种情况下,ILE程序将也会运行在*DFTACTGRP中:
A.ILE程序在编译时使用了DFTACTGRP(*YES)。
B.ILE程序在编译时使用了DFTACTGRP(*NO) ACTGRP(*CALLER),并且此程序被一个OPM程序调用。
注意:通常情况下,如果我们在编译程序的时候不对有关Activation Group的参数进行任何修改,那么我们的程序都会运行在DFTACTGRP中,也就是说,我们的一个JOB实际上就只有一个活动组,因此我们的override 和 commitment control也都是在整个作业的范围内起作用的。
*NEW,DFTACTGRP(*YES), NAMED ACTIVATION GROUP的区别:
*NEW类型的活动组在与此活动组相关的子程序RETURN(不管*INLR的值如何)时被删除,也就是在作业还没有结束的时候就会被删除,此时此活动组的所有资源都被释放。
NAMED ACTIVATION GROUP只有在整个作业结束的时候或者是在用户使用显式的RCLACTGRP时才会被删除。程序占用的存储器空间也只有这时才会被释放。
DFTACTGRP中,只有在程序以*INLR=‘1’的方式退出或者非正常退出的情况下才会释放他占用的存储器空间。因为ACTGRP=*CALLER而运行在DFTACTGRP中的程序只有用户在签退的情况下(交互式作业Interactive Job)或者是作业运行完毕(批作业Batch Job)的情况下才会被释放占用的内存。
注意:如果系统中有许多程序在占用存储器,那么系统就可能因为存储器资源不够而瘫痪。因此,我们必须避免让大量的程序都运行在DFTACTGRP中,因为这时存储器只有在作业停止的时候才会被系统回收。
服务程序的资源只有在它运行的活动组结束的时候才会被系统回收。如果服务程序是运行在DFTACTGRP中,那么只有在整个作业运行结束后系统才会回收它所占用的资源。
我们可以使用RCLACTGRP命令来删除一个Named Activation Group。
RCLRSC命令可以用来回收那些已经结束但是*INLR=*ON的程序所占的资源。