2015-01-31 1 views
0

Вчера на работе я запустил программу другим, и я вернул ошибку на курсор. Курсор был соединением между двумя таблицами и любыми полями в выборке или где sentece не содержит нулевых значений. Предложение выборки содержало три поля. И таблицы содержали 25 полей для всех, некоторые нули.Ошибка Cobol db2 nulls значения

Ошибка была sqlcode = -305 (пустые значения).

Кто-нибудь знает, почему не следует использовать пустые поля, возвращает мне эту ошибку?

Например,

В курсора:

SELECT A.FIELD1, B.FIELD2, B.FIELD3 
FROM TABLE1 AS A LEFT JOIN TABLE2 AS B ON A.FIELD4 = B.FIELD5 

Поля (FIELD1 .... Field5) не NULLS, но в таблицах, например field16 равна нулю.

В выборки:

EXEC SQL 
    FETCH MY-CURSOR INTO :FIELD1-A, :FIELD2-B, :FIELD3-B 
END-EXEC 

field1, field2 и field3 не нулевой, нужны индикаторы?

ТОЧНО код:

EXEC SQL            
    DECLARE CTOAZ7OA CURSOR WITH HOLD FOR     
    select B.C00LTIPO_ADQ, B.C00LCSB_ADQ, A.COAZ7CRESU 
    from TOAZ7S1 A left outer join toaZFs1 B on   
     (A.COA43LCOME_DES = B.COA43LCOME AND    
     A.COAZFLTERM_DES = B.COAZFLTERM)        
    where A.COAZ7FOPER <= :WS-SYSIN-FECHA    
    and A.COA43LCOME_DES not in (999008881)    
    and A.COAZ7CTIOP in ('P')       
    and A.COAZ7CRESU in ('a', 'A', 'd', 'D')   
    ORDER BY B.C00LTIPO_ADQ, B.C00LCSB_ADQ    
END-EXEC.            



INITIALIZE DCLTOAZ7S1 DCLTOAZFS1     


    EXEC SQL           
     FETCH CTOAZ7OA INTO      :DCLTOAZFS1.C00LTIPO-ADQ 
               :NULL-C00LTIPO-ADQ   
               ,:DCLTOAZFS1.C00LCSB-ADQ 
               :NULL-C00LCSB-ADQ   
               ,:DCLTOAZ7S1.COAZ7CRESU  
               :NULL-COAZCRESU   
    END-EXEC           

Определение переменных:

COAZ7CRESU      CHAR(1) NOT NULL 
    C00LTIPO_ADQ     SMALLINT NOT NULL 
    C00LCSB_ADQ     SMALLINT NOT NULL 

С нулевым показателем работает отлично, но я не понимаю. Кто-нибудь, не могли бы вы мне объяснить? Благодаря

+0

Null индикаторные переменные необходимы для столбцов, _allow_ аннулирует, они не должны фактически _contain_ нулевые значения. – mustaccio

+0

Да, в этом случае в db2 объявить не null эти поля ... Потому что я не понимаю ... –

+0

Я не уверен, что вы это поняли. Значения * source * в вашей таблице не могут содержать нули. Значения из вашего JOIN * могут *, если только все значения в таблице, из которой вы соединяетесь, существуют в таблицах, к которым вы присоединяетесь. Присоедините таблицу А. к таблице B. Где таблица.A не соответствует, вы все равно получаете строку из объединения, при этом значения таблицы B являются нулевыми (независимо от того, является ли исходный столбец нулевым). –

ответ

3

Проблема является LEFT JOIN, это вернет каждую запись соответствия в таблице 1 и обнуляет для таблицы 2, когда есть нет записи соответствия.

Вы должны кодировать индикатор пустого (или флаг) в вашем SQL. см Handling Null Characters или Google it

основном

EXEC SQL 
    FETCH MY-CURSOR INTO 
     :FIELD1-A, 
     :FIELD2-B :FIELD2-B-NULL-INDICATOR, 
     :FIELD3-B :FIELD3-B-NULL-INDICATOR 
END-EXEC. 

где FIELD2-B-NULL-ИНДИКАТОР и FIELD3-B-NULL-ИНДИКАТОР являются нулевые флаги для полей FIELD2 и field3.


Пример того, что происходит

Если это входные таблицы

Table1 
    Field1 Field5 
    1  1 
    2  5 
    3  6 
    4  4 

Table2 
    Field5 Field2 Field3 
    1   11  12 
    4   41  44 

то результат

SELECT A.FIELD1, B.FIELD2, B.FIELD3 
    FROM TABLE1 AS A LEFT JOIN TABLE2 AS B ON A.FIELD4 = B.FIELD5 

будет

Field1 Field2 Field3 
    1   11  12 
    2   null null  - null because there is no matching entry in table 2 
    3   null null 
    4   41  42 

Так левый присоединиться вводит возможность Nulls

+0

Спасибо, Брюс, да, я так же думаю, но никаких нулей в выборке, я отредактирую вопрос с примера, потому что исходный код находится в офисе. –