由于我是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级的特殊特征还是我在某个地方错了?
答案 0 :(得分:2)
请注意,如果您将INPT-REC2
用作VARCHAR
字段的宿主变量,则您只会看到INPT-REC
中的部分,因为您从未更新过长度字段:它仍然包含它从INPT-REC
分配的长度。
因此,您必须以某种方式获取INPT2-TEXT
的实际长度(例如INSPECT
的{{1}}的{{1}}),然后将其移动到REVERSE
之前的INPT2-TEXT
。
正如我在评论中已经说过的:LEADING SPACES
级别没有什么特别的-您也可以使用INPT2-LENGTH
,EXEC SQL
,49
或{{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。