Вчера на работе я запустил программу другим, и я вернул ошибку на курсор. Курсор был соединением между двумя таблицами и любыми полями в выборке или где 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
С нулевым показателем работает отлично, но я не понимаю. Кто-нибудь, не могли бы вы мне объяснить? Благодаря
Null индикаторные переменные необходимы для столбцов, _allow_ аннулирует, они не должны фактически _contain_ нулевые значения. – mustaccio
Да, в этом случае в db2 объявить не null эти поля ... Потому что я не понимаю ... –
Я не уверен, что вы это поняли. Значения * source * в вашей таблице не могут содержать нули. Значения из вашего JOIN * могут *, если только все значения в таблице, из которой вы соединяетесь, существуют в таблицах, к которым вы присоединяетесь. Присоедините таблицу А. к таблице B. Где таблица.A не соответствует, вы все равно получаете строку из объединения, при этом значения таблицы B являются нулевыми (независимо от того, является ли исходный столбец нулевым). –