Cobol错误db2使值无效

时间:2015-01-31 15:35:34

标签: null db2 cobol mainframe

昨天在工作中我运行了另一个程序,我在光标上返回了一个错误。游标是两个表和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指标工作完美,但是,我不明白。有人,你能解释一下吗? 感谢

1 个答案:

答案 0 :(得分:4)

问题是 LEFT JOIN ,这将在表1 nulls 中返回每个匹配条目当没有匹配条目时,表2。

您需要在 SQL 中对空指标(或标记)进行编码。请参阅Handling Null CharactersGoogle 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

的可能性