Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44238
  • 博文数量: 10
  • 博客积分: 557
  • 博客等级: 下士
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-25 20:13
文章分类

全部博文(10)

文章存档

2011年(9)

2010年(1)

分类: 数据库开发技术

2011-09-08 14:13:08

网上流传一道题:data areadata queue的区别。

我个人觉得data areadata queue除了长的比较像之外,其可比性并不大。从大的方向说,data areadata queue的共同点仅仅是二者都可以完成不同job间的通讯的功能(即数据交换),但是相同的功能还可以由 PFuser space等完成,为什么没人把它们都拿来一起比较呢?因为长的不像??hoho~~~

下面分别介绍一下Data AreaData Queue,希望能给困惑者带来一点帮助,不对的地方欢迎指正。

 

Data Area

 

基本信息

       Data Area在系统中用*DTAARA来表示,实际上OS400Data 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的操作符有以下几个:INOUT*LOCKUNLOCK

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 解锁可以通过

       1OUT——更新并解锁

       2UNLOCK ——解锁

       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    OverlayLocal5

 *

C                    IN       Local

C                    EVAL    orderNum=’12345’

C                    OUT     Local

如果Data Area*LDA的话,不用锁住Data Area,更新Data Area也不会报错,不是*LDA的话,以上代码就会报错。

 

 

阅读(3992) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~