如何将可变长度记录的长度增加到 32760 以上?

How can I increase the length of variable-length record beyond 32760?

可变长度 QSAM 记录的最大记录长度为 32,760 字节。

我们文件的当前记录长度对我们来说还可以,但为了处理更多信息,我们必须扩展该文件,使其长度超过 32K (LRECL > 32760)。

拆分记录对我们来说不是一个好的选择,因为它会影响我们现有的系统。

我不确定在这里使用 SPANNED 记录和 VSAM 是否能解决这个问题。

//DEFINE EXEC PGM=IDCAMS
//SYSPRINT  DD SYSOUT=A
//SYSIN     DD *

  DEFINE CLUSTER (NAME(dsname.K1719) INDEXED VOLUMES(xxxxxx) -
         TRACKS(1) KEYS(17 19) RECORDSIZE(40 110) SPANNED) -
         DATA (NAME(dsname.K1719.DATA)) INDEX (NAME(dsname.K1719.INDEX))
/*
//

这会解决我们的问题吗?

如果您使用 Unix 系统服务文件,则不受 LRECL 的 32K 限制。有 下游影响。

  • 如果您使用 COBOL 来处理文件,您可以使用 LINE ORGANIZATION 子句中的 SEQUENTIAL,但是你被限制为 1M LRECL.
  • 如果您使用 COBOL 来处理文件,您可以避开 COBOL I/O
    并使用 C fopen() 等等来绕过 1M LRECL 上面提到的限制,但是你要添加一些东西 对于公认的假设 COBOL 应用程序来说是陌生的。 C会 处理此类文件没有问题,我无法与 PL/I.
  • 通话
  • 并非所有 DFSMS 和第三方实用程序都完全意识到 Unix 系统服务 文件。
  • Unix 系统服务文件的 JCL 结构相对较短 学习曲线,但是 需要一点学习。
  • Unix 系统服务文件的安全性可能会让您感到不快 安全管理员。您可能会发现自己必须设置 通过 setfacl 和其他新概念的访问控制列表。

@cschneid 的回答很有趣。

在不了解更多关于文件/应用程序的情况下,很难给出具体的答案。以下是可能有用的想法。

你可以:

  • 将字帖分成几个子记录
  • 向密钥添加一个额外的字节

所以不用

<key><a record>

你会

<key><sub-key-1><part-1-of-record>
<key><sub-key-2><part-2-of-record>
<key><sub-key-3><part-3-of-record>
 ...

如果您有一个与文件交互的 File-Driver 程序, 您可以从您的应用程序中隐藏数据存储方式的详细信息。所以你可以为每个逻辑记录有多个物理记录,你的应用程序不需要知道它。如果需要,您也可以拥有多个文件

记住,您可以在不需要存储在文件中的新字帖末尾添加space。当您需要向文件添加字段时,这会派上用场 - 可以节省重新编译大量程序


文件是否包含逻辑上不同的数据(例如 salesorders 等),每个程序 访问文件使用 整个 记录 ???

如果是这样,您可以将请求类型添加到 File-Driver-Program:

的调用中
   Call "FilePgm" using GET-ORDER  Order-Copybook
or 
   Call "FilePgm" using GET-SALES  Sales-Copybook 
or
   Call "FilePgm" using GET-EVERYTHING  Everything-Copybook 

多次调用的好处 types/copybooks 是如果 Order-Copybook 发生变化,仅使用 Sales-Copybook 的程序 不需要 重新编译,反之亦然.这将使以后更改文件更容易。


终于有了数据库选项!!!,或者

  • 完全重写

  • 或使用二进制 blob。这些对二进制 blob 有 2gb 的限制

    对于 DB2,您可以使用 Compression,这很有用。大记录通常具有高压缩率。压缩的优势不是 space 节省,而是减少 IO。