Cobol 错误 db2 空值
Cobol error db2 nulls values
昨天在工作中,我 运行 编写了另一个程序,但我在游标上返回了一个错误。游标是两个表和提取中的任何字段之间的连接,或者句子不包含空值的地方。
fetch 语句包含三个字段。每个人的表都包含 25 个字段,有些是空值。
错误是 sqlcode= -305(空值)。
有谁知道为什么不应该使用空字段 returns 我那个错误?
例如,
光标处:
SELECT A.FIELD1, B.FIELD2, B.FIELD3
FROM TABLE1 AS A LEFT JOIN TABLE2 AS B ON A.FIELD4 = B.FIELD5
字段 (FIELD1....FIELD5) 不是空值,但在表中,例如 field16 是空值。
在抓取中:
EXEC SQL
FETCH MY-CURSOR INTO :FIELD1-A, :FIELD2-B, :FIELD3-B
END-EXEC
字段1、字段2、字段3不为空,需要指标吗?
准确代码:
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 指示器效果很好,但是,我不明白。有人,你能解释一下吗?
谢谢
问题是 LEFT JOIN,这将 return [=] 中的每个 匹配条目54=] 1 和 nulls 对于 table 2 当有 no 匹配条目时。
您需要在 SQL 中编写一个 空指标 (或标志)。参见 Handling Null Characters or 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-INDICATOR 和 FIELD3-B-NULL-INDICATOR 是字段 FIELD2 和 FIELD3 的空标志。
正在发生的事情的一个例子
如果这是输入tables
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
所以Left join引入了Nulls的可能性
昨天在工作中,我 运行 编写了另一个程序,但我在游标上返回了一个错误。游标是两个表和提取中的任何字段之间的连接,或者句子不包含空值的地方。 fetch 语句包含三个字段。每个人的表都包含 25 个字段,有些是空值。
错误是 sqlcode= -305(空值)。
有谁知道为什么不应该使用空字段 returns 我那个错误?
例如,
光标处:
SELECT A.FIELD1, B.FIELD2, B.FIELD3
FROM TABLE1 AS A LEFT JOIN TABLE2 AS B ON A.FIELD4 = B.FIELD5
字段 (FIELD1....FIELD5) 不是空值,但在表中,例如 field16 是空值。
在抓取中:
EXEC SQL
FETCH MY-CURSOR INTO :FIELD1-A, :FIELD2-B, :FIELD3-B
END-EXEC
字段1、字段2、字段3不为空,需要指标吗?
准确代码:
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 指示器效果很好,但是,我不明白。有人,你能解释一下吗? 谢谢
问题是 LEFT JOIN,这将 return [=] 中的每个 匹配条目54=] 1 和 nulls 对于 table 2 当有 no 匹配条目时。
您需要在 SQL 中编写一个 空指标 (或标志)。参见 Handling Null Characters or 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-INDICATOR 和 FIELD3-B-NULL-INDICATOR 是字段 FIELD2 和 FIELD3 的空标志。
正在发生的事情的一个例子
如果这是输入tables
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
所以Left join引入了Nulls的可能性