在RPG程序中使用长文件名

时间:2018-10-11 20:17:08

标签: ibm-midrange db2-400 rpgle

我想在RPG程序(OS V7.1或v7.2)中使用db2 / SQL创建的长文件名。我无法使用旧版DDS创建具有超过10个字符的表,但是Db2 / SQL允许我创建具有长文件名的表。示例:

CREATE TABLE QTEMP.VERYLONGNAMETABLE (COLUMN1 CHAR (30) NOT NULL 
WITH DEFAULT)                                           
RCDFMT VERYRC                                      

当我处理对象命令时,我看到OS将表识别为VERYL00001,而不是VERYLONGNAMETABLE。

如果我尝试在RPG中使用VERYL00001名称,则会起作用:

         DCL-F VERYL00001 DISK(*EXT) USAGE(*INPUT)'

但这失败,因为RPG的10个字符限制:

         DCL-F VERYLONGNAMETABLE DISK(*EXT) USAGE(*INPUT)

但是我可以这样做,这给了我内部长名,但指向外部10个字符的短名。

    DCL-F VERYLONGNAMETABLE  DISK(*EXT) USAGE(*INPUT)
         extfile('extdesc')
         extdesc('VERYL00001')  ;      

与此相关的令人担忧的事情是,如果我删除VERYL00001对象,并创建名为VERYLONGNAMETABLE_2的新表,则OS会给我相同的VERYL00001名称。这很令人担忧,因为它可能引起混乱。

我了解到我可以使用ALIAS。

 CREATE ALIAS VERYLONG FOR VERYLONGNAMETABLE 

但这会创建一个DDMF文件,如果我记得从前有性能和其他问题。

我还可以将(RNMOBJ)VERYL00001重命名为VERYLONG。然后,至少我可以为想要查询长名并仍然在RPG中使用的用户提供长名

      DCL-F VERYLONGNAMETABLE  DISK(*EXT) USAGE(*INPUT)
            extfile('extdesc')
          extdesc('VERYLONG')  ;     

或简单地:

      DCL-F VERYLONG  DISK(*EXT) USAGE(*INPUT)

我不喜欢每个表都由两个不同的名称标识这一事实。我相信这会引起混乱。

我在这里错过了任何选择吗?

1 个答案:

答案 0 :(得分:5)

使用SQL创建表时,还可以像这样指定系统名称:

create table MYLONGTABLENAMEFORTHISTABLE for system name MYTAB12345
(myval char(10))

这将允许您指定要通过例如DCL-F MYTAB12345 DISK(*EXT) USAGE(*INPUT)规范访问RPG时可以在RPG中使用的确切对象名称。

这不会消除所有表都具有两个名称的考虑,但至少允许您控制名称以防止重用表名称。我不知道有什么解决方案可以消除所有这些问题,除了坚持使用较短的表名或不使用DCL-F而不是仅使用SQL。但这并不能真正解决您最初试图解决的问题。