如何将可变长度记录的长度增加到 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。当您需要向文件添加字段时,这会派上用场 - 可以节省重新编译大量程序
文件是否包含逻辑上不同的数据(例如 sales 和 orders 等),每个程序 访问文件使用 整个 记录 ???
如果是这样,您可以将请求类型添加到 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。
可变长度 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
并使用 Cfopen()
等等来绕过 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。当您需要向文件添加字段时,这会派上用场 - 可以节省重新编译大量程序
文件是否包含逻辑上不同的数据(例如 sales 和 orders 等),每个程序 访问文件使用 整个 记录 ???
如果是这样,您可以将请求类型添加到 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。