可以将49级用于STRING吗?

时间:2018-08-21 05:13:03

标签: cobol

由于我是cobol的新手,请通过以下代码帮助我。

WORKING-STORAGE SECTION.

01 BAS-REC.

      02 INPT-REC.
      49 INPT-LEN   PIC S9(4) COMP.
      49 INPT-TEXT  PIC X(150).

   02 INPT1-REC.

      49 INPT1-LEN   PIC S9(4) COMP.
      49 INPT1-TEXT  PIC X(150).

   02 INPT2-REC.

      49 INPT2-LEN   PIC S9(4) COMP.
      49 INPT2-TEXT  PIC X(150).

77  VAR1   PIC  X(5) VALUE 'APT'.

77  NUM1   PIC  9(1). 

我在这里使用49级字符来改变字符(以截断尾随空格)

然后我有游标获取。

PROCEDURE DIVISION下进行一些修改后,我正在执行以下操作。

PERFORM UNTIL SQLCODE=100

PERFORM VARYING NUM1 FROM 1 BY 1 UNTIL NUM1=6

STRING INPT-REC DELIMITED BY '  ',' ',
       VAR1 DELIMITED BY '  ',' '
       NUM1 DELIMITED BY '  ' INTO INPT2-REC

EXEC SQL

insert query here (which will run 5 times) 

END-EXEC

END- PERFORM

END- PERFORM

,但是在表中,数据仅被插入一次,但是其数据段已被插入5次,并且INPT2-REC也没有被串联。 INPT2 -REC仅包含INPT-REC的值

我的问题是这是49级的特殊特征还是我在某个地方错了?

2 个答案:

答案 0 :(得分:2)

请注意,如果您将INPT-REC2用作VARCHAR字段的宿主变量,则您只会看到INPT-REC中的部分,因为您从未更新过长度字段:它仍然包含它从INPT-REC分配的长度。

因此,您必须以某种方式获取INPT2-TEXT的实际长度(例如INSPECT的{​​{1}}的{​​{1}}),然后将其移动到REVERSE之前的INPT2-TEXT

正如我在评论中已经说过的:LEADING SPACES级别没有什么特别的-您也可以使用INPT2-LENGTHEXEC SQL49或{{1} },结果相同。 DB2手册中的样本可能使用48,因为它是最后一个有效的级别号,没有任何特殊含义,因此它最不可能引起程序中已经使用的任何级别号的问题。

至于查询仅执行一次:在您的循环中,您正在更改33,但正在检查是否30-因为我们在您的示例中没有看到05,所以我可以只能猜测进入循环时已经等于6。

答案 1 :(得分:1)

当涉及嵌入式SQL时,取决于系统,可以特别地对待49级。此文本是从IBM知识中心复制的

COBOL中的主机结构声明必须满足以下要求:

COBOL主机结构最多可以具有两个级别,即使该主机结构可能出现在具有多个级别的结构中。但是,您可以声明长度可变的字符串,该字符串必须为49级。

主机结构名称可以是组名称,其下属级别可以命名基本数据项。

如果使用的是DB2®预编译器,请不要在以下任何一项之后声明任何子级别的主机变量或主机结构:

    A COBOL item that begins in area A
    Any SQL statement (except SQL INCLUDE)
    Any SQL statement within an included member

当DB2预编译器在主机结构中遇到上述项目之一时,它将认为该结构是完整的。


因此,这似乎是一些实现细节(var char为49级),可能会溢出到COBOL ESQL的其他实现中。就像系统中埋藏的许多细节一样,知道这一点需要知道这一点。

这个细节是几分钟前对我而言的新闻。

现在来看,这是最近在GnuCOBOL的esqlOC贡献中提出的。 49级特定的调整,以确保无需担心主机和服务之间的小端大端存储。所以这似乎是一件事情。

原始问题的答案是;取决于编译器环境和ESQL预处理程序,但是是的,也许可以将49级字段用于VARCHAR。