2015-12-15 5 views
1

У меня есть странная проблема.COBOL встроенный SQL

  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.          
+0

Вы уверены, что подключились к одному и тому же БД/серверу? – lad2025

+0

Очень странно. Вы уверены, что вы подключены к той же базе данных, что и тот же пользователь? – jarlh

+0

Да, я уверен. Каждый раз, когда я пытаюсь использовать WHERE CENSUS.WORLDIMR.COUNTRY LIKE 'L%', его отображение 00.0 – bastel

ответ

5

Руководства большие вещи, особенно когда поиск двигатель может попасть прямо в них:

DB2 SQL, как

Первый нажмите, чтобы перейти к руководству, представленному вам через Центр знаний IBM. Это для DB2 11.0, поэтому вы должны сделать очевидное изменение, если не используете 11.0.

Чтение, вы придёте к:

Если шаблон указан в переменной строки фиксированной длины, любые завершающие пробелы интерпретируются как часть шаблона. Таким образом, это лучше использовать строчную переменную переменной длины с фактической длиной , которая совпадает с длиной шаблона. Если язык хоста не допускает переменные строки переменной длины, поместите шаблон в строковой переменной фиксированной длины, длина которой равна длине рисунка.

Дополнительные сведения об использовании переменных хоста с конкретными языками программирования см. В переменных хоста.

Язык, в котором вы работаете, COBOL, не допускает переменные строки переменной длины (одна из вещей делает это так быстро, поэтому не жалуйтесь).

Итак, ваш постоянный (буквальный в COBOL) для LIKE должен быть такой же длины, как и столбец, и все дополнительные позиции в литерале должны также быть% (по крайней мере, до конца фактическая максимальная длина любых данных, которые будут соответствовать LIKE, строго).

Или используйте переменную хоста COBOL этой длины, снова заполненную хвостом% s вместо конечных пробелов.

Или используйте переменную типа varchar (таблица COBOL с элементами, содержащими длину данных в виде двухбайтовых двоичных файлов со значением 2, а затем ваш L%).

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

Даже если литерал работал, как вы ожидали (без чтения руководства) это вообще плохая идея иметь «значительные» литералы в PROCEDURE DIVISION. Вторая причина использования переменной-хоста.

+0

В моей книге основным преимуществом переменных фиксированной длины является то, что время памяти программы определяется во время компиляции, что делает невозможным утечку памяти. Делает эксплуатацию намного безопаснее. Но да, у него есть несколько преимуществ производительности. – gazzz0x2z

+0

@ gazzz0x2z Даже с полями переменной длины вы не можете получить утечки памяти вообще в Enterprise COBOL, если придерживаетесь COBOL (при условии ошибок компилятора). Под эксплуатацией вы имеете в виду что-то угонщить что-то из программы? За исключением кого-то, работающего на сайте, когда это было бы просто тяжело, это невозможно из-за внешнего местоположения. Конечно, пробег зависит от других менее зрелых ОС и других компиляторов. –

+0

Нет, я просто говорил о людях, которые запустили и наблюдали за сотнями процессов одновременно. Они не любят видеть, как процесс поедает все пространство памяти, полезное для других. Угон, otoh, это не вопрос языка, и риск обычно начинается, когда вы думаете, что нет риска. – gazzz0x2z

 Смежные вопросы

  • Нет связанных вопросов^_^