当前位置:  开发笔记 > 数据库 > 正文

COBOL嵌入式SQL

如何解决《COBOL嵌入式SQL》经验,为你挑选了1个好方法。

我有一个奇怪的问题.

         EXEC SQL SELECT                             
         AVG(LER)                                   
         INTO :LER-MIN                              
         FROM CENSUS.WORLDIMR                       
   *     WHERE CENSUS.WORLDIMR.COUNTRY LIKE 'L%'    
         END-EXEC.                           

这给出了72.2,但是当我使用时

WHERE CENSUS.WORLDIMR.COUNTRY LIKE 'L%'

它给出了00.0.

但是在SPUFI中尝试这个:

select avg(ler)                              
from census.worldimr                         
where census.worldimr.country like 'L%';    

发出71.33333333333.

我做错了什么?

这是该计划:

000001        PROCESS SQL                                                      
000002        IDENTIFICATION DIVISION.                                         
000003        PROGRAM-ID. CBL7.                                                
000004       *--------------------                                             
000005        ENVIRONMENT DIVISION.                                            
000006       *--------------------                                             
000007        CONFIGURATION SECTION.                                           
000008        INPUT-OUTPUT SECTION.                                            
000009        FILE-CONTROL.                                                    
000010            SELECT P3OUT ASSIGN TO UT-S-P3OUT.                           
000011                                                                         
000012        DATA DIVISION.                                                   
000013       *-------------                                                    
000014        FILE SECTION.                                                    
000015        FD  P3OUT                                                        
000016            RECORD CONTAINS 80 CHARACTERS                                
000017            LABEL RECORDS ARE OMITTED                                    
000018            RECORDING MODE F                                             
000019            DATA RECORD IS PRTREC.                                       
000020                                                                         
000021        01 PRTREC.                                                       
000022           02 LER-PRT              PIC 99.9.                             
000023           02 FILLER               PIC X(76).                            
000024                                                                         
000025        WORKING-STORAGE SECTION.                                         
000026        01  VARS.                                                        
000027            10 LER-MIN              PIC S9(5)V9(1) USAGE COMP-3.         
000028                                                                         
000029             EXEC SQL INCLUDE SQLCA  END-EXEC.                           
000030       ******************************************************************
000031       *        TABLE(CENSUS.WORLDIMR)                                  *
000032       ******************************************************************
000033            EXEC SQL DECLARE CENSUS.WORLDIMR TABLE                       
000034            ( REGION                         CHAR(5) NOT NULL,           
000035              COUNTRY                        CHAR(30) NOT NULL,          
000036              YR                             CHAR(4) NOT NULL,           
000037              IMR                            DECIMAL(5, 1) NOT NULL,     
000038              IMRM                           DECIMAL(5, 1) NOT NULL,     
000039              IMRF                           DECIMAL(5, 1) NOT NULL,     
000040              IMR1_4                         DECIMAL(5, 1) NOT NULL,     
000041              IMR1_4M                        DECIMAL(5, 1) NOT NULL,     
000042              IMR1_4F                        DECIMAL(5, 1) NOT NULL,     
000043              IMR_5                          DECIMAL(5, 1) NOT NULL,     
000044              IMR_5M                         DECIMAL(5, 1) NOT NULL,     
000045              IMR_5F                         DECIMAL(5, 1) NOT NULL,     
000046              LER                            DECIMAL(5, 1) NOT NULL,     
000047              LERM                           DECIMAL(5, 1) NOT NULL,     
000048              LERF                           DECIMAL(5, 1) NOT NULL      
000049            ) END-EXEC.                                                  
000050       ******************************************************************
000051       * COBOL DECLARATION FOR TABLE CENSUS.WORLDIMR                    *
000052       ******************************************************************
000053        01  WORLDIMR.                                                    
000054            10 REGION               PIC X(5).                            
000055            10 COUNTRY              PIC X(30).                           
000056            10 YR                   PIC X(4).                            
000057            10 IMR                  PIC S9(4)V9(1) USAGE COMP-3.         
000058            10 IMRM                 PIC S9(4)V9(1) USAGE COMP-3.         
000059            10 IMRF                 PIC S9(4)V9(1) USAGE COMP-3.         
000060            10 IMR1-4               PIC S9(4)V9(1) USAGE COMP-3.         
000061            10 IMR1-4M              PIC S9(4)V9(1) USAGE COMP-3.         
000062            10 IMR1-4F              PIC S9(4)V9(1) USAGE COMP-3.         
000063            10 IMR-5                PIC S9(4)V9(1) USAGE COMP-3.         
000064            10 IMR-5M               PIC S9(4)V9(1) USAGE COMP-3.         
000065            10 IMR-5F               PIC S9(4)V9(1) USAGE COMP-3.         
000066            10 LER                  PIC S9(4)V9(1) USAGE COMP-3.         
000067            10 LERM                 PIC S9(4)V9(1) USAGE COMP-3.         
000068            10 LERF                 PIC S9(4)V9(1) USAGE COMP-3.         
000069                                                                         
000070        PROCEDURE DIVISION.                                              
000071       *------------------                                               
000072            EXEC SQL SELECT                                              
000073             AVG(LER)                                                    
000074             INTO :LER-MIN                                               
000075             FROM CENSUS.WORLDIMR                                        
000076             WHERE CENSUS.WORLDIMR.COUNTRY LIKE 'L%'                     
000077             END-EXEC.                                                   
000078            OPEN OUTPUT P3OUT.                                           
000079            MOVE LER-MIN TO LER-PRT.                                     
000080            WRITE PRTREC.                                                
000081            CLOSE P3OUT.                                                 
000082            STOP RUN.                                     

Bill Woodger.. 5

手册是很棒的东西,特别是当搜索引擎可以直接进入它们时:

db2 sql就好

第一篇文章应该将您带到通过IBM Knowledge Center呈现给您的手册.它适用于DB2 11.0,因此如果您不使用11.0,则应该进行明显的更改.

读书,你会来:

如果在固定长度的字符串变量中指定模式,则任何尾随空白都将被解释为模式的一部分.因此,最好使用变长字符串变量,其实际长度与模式的长度相同.如果宿主语言不允许变长字符串变量,则将模式放在固定长度的字符串变量中,该变量的长度是模式的长度.

有关使用特定编程语言的主机变量的更多信息,请参阅主机变量.

您正在使用的语言COBOL不允许使用变长字符串变量(这使得它变得如此之快,因此不要抱怨).

因此,LIKE的常量(COBOL中的字面值)需要与所涉及的列的长度相同,并且文字中的所有其他位置也需要为%(至少直到实际最大长度的末尾)任何与LIKE匹配的数据,严格地说.

或者,使用该长度的COBOL主机变量,再次使用尾随%s而不是尾随空格填充.

或者使用类似varchar的host-variable(一个COBOL表,其中包含数据长度为2字节的二进制文件,值为2,然后是你的L%).

01 varchar-host-variable.
    05  vhv-length               COMP-5 PIC 9(4).
    05  vhv-data                        PIC XX.

即使文字按预期工作(不阅读手册),在程序部门中拥有"重要"文字通常也是一个坏主意.使用主机变量的第二个原因.



1> Bill Woodger..:

手册是很棒的东西,特别是当搜索引擎可以直接进入它们时:

db2 sql就好

第一篇文章应该将您带到通过IBM Knowledge Center呈现给您的手册.它适用于DB2 11.0,因此如果您不使用11.0,则应该进行明显的更改.

读书,你会来:

如果在固定长度的字符串变量中指定模式,则任何尾随空白都将被解释为模式的一部分.因此,最好使用变长字符串变量,其实际长度与模式的长度相同.如果宿主语言不允许变长字符串变量,则将模式放在固定长度的字符串变量中,该变量的长度是模式的长度.

有关使用特定编程语言的主机变量的更多信息,请参阅主机变量.

您正在使用的语言COBOL不允许使用变长字符串变量(这使得它变得如此之快,因此不要抱怨).

因此,LIKE的常量(COBOL中的字面值)需要与所涉及的列的长度相同,并且文字中的所有其他位置也需要为%(至少直到实际最大长度的末尾)任何与LIKE匹配的数据,严格地说.

或者,使用该长度的COBOL主机变量,再次使用尾随%s而不是尾随空格填充.

或者使用类似varchar的host-variable(一个COBOL表,其中包含数据长度为2字节的二进制文件,值为2,然后是你的L%).

01 varchar-host-variable.
    05  vhv-length               COMP-5 PIC 9(4).
    05  vhv-data                        PIC XX.

即使文字按预期工作(不阅读手册),在程序部门中拥有"重要"文字通常也是一个坏主意.使用主机变量的第二个原因.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有