分类: 数据库开发技术
2011-09-08 14:13:08
网上流传一道题:data area和data queue的区别。
我个人觉得data area和data queue除了长的比较像之外,其可比性并不大。从大的方向说,data area和data queue的共同点仅仅是二者都可以完成不同job间的通讯的功能(即数据交换),但是相同的功能还可以由 PF,user space等完成,为什么没人把它们都拿来一起比较呢?因为长的不像??hoho~~~
下面分别介绍一下Data Area和Data Queue,希望能给困惑者带来一点帮助,不对的地方欢迎指正。
Data Area
一 基本信息
Data Area在系统中用*DTAARA来表示,实际上OS400把Data Area当作一个单独的字段。
Data Area中存储的数据类型有3种,分别是*CHAR、*DEC、*LGL。它们的最大的长度分别为:
*CHAR——2000个字符
*DEC ——1个数字(最长为24 digits, 9 decimal positions。实际上长度不能超过15)
*LGL ——1个逻辑值(‘1’或者‘0’)
由此可见,Data Area所能保存的信息量十分有限,对于*DEC和*LGL来说,仅仅能保存一个数值;对与*CHAR类型来说,能保存2000个字符的数据。所以,Data Area不适用于大量数据的处理。通常用Data Area来保存一些被多个job共用的控制信息。另外,Data Area仅仅是一个单独的字段,不需要像PF中那样用游标来定位记录,所以打开一个Data Area的系统开销要比打开一个PF要小的多,效率高得多。这就是Data Area最大的优点。
二 使用方法
Data Area的创建、删除、修改、显示可以用CL命令在命令行上操作,或者在CLP程序中操作,都比较简单,就不多说了。下面说一下在RPGLE中的使用方法。
RPG中关于Data Area的操作符有以下几个:IN、OUT、*LOCK、UNLOCK,
IN:读取Data Area
OUT:输出更新Data Area并解锁
*LOCK: 为Data Area加上锁
UNLOCK:为Data Area 解锁
下面举个例子来说明Data Area的基本操作:
D Total DS DTAARA(TotDat) //定义Data Area
D Amount 8 S 2OVERLAY(Total:1)
C *LOCK IN Total //读取并且锁住Data Area
* // your code……
C OUT Total //更新并且释放Data Area锁
OR
C *LOCK IN Total //读取并且锁住Data Area
* // your code……
C UNLOCK Total //释放Data Area锁
关于普通Data Area的锁,做个说明:
1 Data Area的锁是独占只读锁(exclusive, allow read),如果某Data Area已经被锁住了,那么其他的作业只能以只读的方式访问此Data Area,不能用OUT操作。
2 如果想在程序中更新Data Area,则必须先锁住此Data Area(跟UPDATE PF一个道理)。如果没有锁住Data Area,就在那么在程序中用OUT的话,程序会报错,例如:
C IN Total
* // your code…… 没有锁住data area就输出,是不可以的。
C OUT Total
3 Data Area上锁可以通过
1)使用*LOCK IN 方式
2)使用Data Area Data Structure方式(稍后介绍)
4 Data Area 解锁可以通过
1)OUT——更新并解锁
2)UNLOCK ——解锁
3)程序结束并且*INLR=*ON,则锁自然解除。
三 Data Area Data Structure
这种类型的Data Area有点特殊,使用起来会方便一些
定义:
D Total UDS DTAARA(TotDat) //定义Data Area
D Amount 8 S 2OVERLAY(Total:1)
Data Area Data Structure与普通的Data Area定义有一点差异,就是在DS keyword的前面加上一个U,即:UDS
使用方法:
Data Area Data Structure的特别之处就在于,它隐含了两行的代码,如下:
C *LOCK IN Total //读取并且锁住Data Area
*……
C OUT Total //更新并且释放Data Area锁
就是说如果定义成Data Area Data Structure的话,那么程序会自动读取并锁住此Data Area,并且在程序结束的时候,会自动输出更新Data Area并释放锁。所以如果定义成Data Area Data Structure的话,就不需要上面的两行代码了。
四 *LDA——Local Data Area
*LDA算是一种特殊的Data Area,它是长度为1024个字节的字符串,并由系统自动为每个job创建和删除。
每个job只能操作自己的*LDA,不能操作、获取其他job的*LDA的数据。就是说在同一个job内,你愿意怎么折腾都行,但是你不能共享的job的*LDA,别的JOB也不能你的JOB的*LDA。不过有一种特例,即递交出去的作业是可以继承原来作业的*LDA的内容。假如JOB A 用SBMJOB递交出了一个JOB B,那么系统会用JOB A的*LDA的内容来初始化JOB B的*LDA。
因为*LDA是私有的,不用担心其他job会锁住LDA,所以LDA的读取和更新不用上锁,也不会报错。
D Local DS DTAARA(*LDA) //定义*LDA
D orderNum 5 Overlay(Local:5)
*
C IN Local
C EVAL orderNum=’12345’
C OUT Local
如果Data Area是*LDA的话,不用锁住Data Area,更新Data Area也不会报错,不是*LDA的话,以上代码就会报错。