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=] 1nulls 对于 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的可能性