昨天在工作中我运行了另一个程序,我在光标上返回了一个错误。游标是两个表和fetch中的任何字段之间的连接,或者sentece不包含空值。 获取句子包含三个字段。这些表包含每个25个字段,一些空值。
错误是sqlcode = -305(空值)。
有谁知道为什么不应该使用null字段返回我那个错误?
例如,
在光标中:
SELECT A.FIELD1, B.FIELD2, B.FIELD3
FROM TABLE1 AS A LEFT JOIN TABLE2 AS B ON A.FIELD4 = B.FIELD5
字段(FIELD1 .... FIELD5)不为空,但在表中,例如field16为空。
在fetch中:
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指标工作完美,但是,我不明白。有人,你能解释一下吗? 感谢
答案 0 :(得分:4)
问题是 LEFT JOIN ,这将在表1 和 nulls 中返回每个匹配条目当没有匹配条目时,表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-INDICATOR和FIELD3-B-NULL-INDICATOR是字段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
的可能性