Db2 某个地方的字符无效,但情况并非如此

Db2 某个地方的字符无效,但情况并非如此,db2,ibm-midrange,rpgle,Db2,Ibm Midrange,Rpgle,感谢您的回复和建议,+1全面:-)您发布的查询似乎不包含任何主机变量。“每个查询的某些WHERE细节会发生变化”中的哪一个?@mustaccio-我添加了您询问的信息。我注意到您这样做是作为一个动态SQL,可能是因为您的WHERE条件每次都会发生变化。当此操作失败并且您查看程序转储时,SQL主机变量的外观如何?结尾有多余的字符吗?是什么让你认为这是空的?DDSALWNULL关键字本可以用于此列,很容易检查,但在大多数商店中很少使用。更常见的情况是,数字字段中的数据对于数据类型无效。在RPG或CO

感谢您的回复和建议,+1全面:-)

您发布的查询似乎不包含任何主机变量。“每个查询的某些WHERE细节会发生变化”中的哪一个?@mustaccio-我添加了您询问的信息。我注意到您这样做是作为一个动态SQL,可能是因为您的WHERE条件每次都会发生变化。当此操作失败并且您查看程序转储时,SQL主机变量的外观如何?结尾有多余的字符吗?是什么让你认为这是空的?DDS
ALWNULL
关键字本可以用于此列,很容易检查,但在大多数商店中很少使用。更常见的情况是,数字字段中的数据对于数据类型无效。在RPG或COBOL中使用本机I/O可能会更好。@WarrenT。我不知道它是否允许空值——为了安全起见,我总是检查空值。我更喜欢在RPG中使用SQL而不是本机I/O,因为它更简单,而且可以做很多事情。我大体上同意SQL有很多优点,但对于处理PF中的无效数据,在这种情况下,RPG有一些技巧。不幸的是,我们正在处理的表是80年代末90年代初编写的软件套件的一部分。我不知道从DDS定义的文件到DDL定义的表有什么方法,至少不会造成混乱(破坏东西,需要重新编译数千个程序,等等)。如果您知道一种方法,可以神奇地将所有内容切换到DDL定义的表,而不会造成混乱,那么我洗耳恭听!:-)我认为您有一个很好的建议,就是始终使用唯一的光标名称。我的解释是,程序a调用程序b时仍然打开,因此光标仍然打开。请记住,RPG不是单元线程化的,所以一个类似且更令人困惑的问题是,如果您在程序a中链接了一条记录,则可以使用程序b对其进行更新。
SELECT orapdt, oraptm, orodr#, c.ccctls, orbill, b.cuslmn, b.cusvrp, orocty, orost, o.cubzip, o.cucnty, ordcty, ordst, d.cubzip, d.cucnty
FROM order
LEFT JOIN cmtctlf c ON orbill = c.cccode
LEFT JOIN custmast b ON orbill = b.cucode
LEFT JOIN custmast o ON orldat = o.cucode
LEFT JOIN custmast d ON orcons = d.cucode
WHERE
    orstat != 'C' AND
    orbill IN ('ABCDE', 'VWXYZ', 'JKFRTE') AND
    orapdt BETWEEN 2012365 AND 2013362 AND
    o.cucnty = 'USA' AND 
    (o.cubzip LIKE '760%' OR o.cubzip LIKE '761%' OR o.cubzip LIKE '762%') AND
    d.cubzip = '38652' AND
    ordcty = 'NA' AND
    ordst = 'MS' AND 
    d.cucnty = 'USA'
ORDER BY orapdt, oraptm, orodr#
orapdt      7  0
oraptm      4a
orodr#      7a
c.ccctls    6a
orbill      6a
b.cuslmn    2a
b.cusvrp    3a
orocty      4a
orost       2a
o.cubzip    5a
o.cucnty    3a
ordcty      4a
ordst       2a
d.cubzip    5a
d.cucnty    3a
c.cccode    6a
b.cucode    6a
o.cucode    6a
d.cucode    6a
Field HVR0001 and value 1 not compatible. Reason 7.
Conversion error on host variable or parameter *N.
The attributes of variable field HVR0001 in query record format FORMAT0001 are not compatible with the attributes of value number 1. The value is *N. The reason code is 7.
7 -- Value contains numeric data that is not valid
Host variable or parameter *N or entry 1 in a descriptor area contains a value that cannot be converted to the attributes required by the statement. Error type 6 occurred.
6 -- Numeric data that is not valid.
...
exec sql PREPARE S1 FROM :sql_stmt;
exec sql DECLARE C1 SCROLL CURSOR FOR S1;
exec sql OPEN C1;
...
SQLSTATE:  22023
SQLCODE:  -302
SQLERRMC:  <non-displayable character>*N
d eds_custmast  e ds    extname('CUSTMAST') inz
d eds_order     e ds    extname('ORDER') inz

d o               ds
d orapdt                like(ORAPDT)
d oraptm                like(ORAPTM)
d orodr#                like(ORODR#)
d orctls                like(CUCODE)
d orbill                like(ORBILL)
d orslmn                like(CUSLMN)
d orcsr                 like(CUSVRP)
d orocty                like(OROCTY)
d orost                 like(OROST)
d orozip                like(CUBZIP)
d orocntry              like(CUCNTY)
d ordcty                like(ORDCTY)
d ordst                 like(ORDST)
d ordzip                like(CUBZIP)
d ordcntry              like(CUCNTY)

// Define an array to indicate nulls...
d o1nv            s     3i 0 dim(15)
dow sqlcode = *zeros;
   exec sql FETCH NEXT FROM C1 INTO :o :o1nv;

   if sqlcode = *zeros;
      // process the data.
   endif;
enddo;

exec sql CLOSE C1;
orstat != 'C' AND orapdt BETWEEN 2012365 AND 2013362
SELECT case when orapdt is null 
               then 9999999
            when TRANSLATE(SUBSTR(orapdt,1,LENGTH(orapdt)-1),' ','0123456789',' ') <>' '
               then 8888888
            else orapdt 
       end
       , oraptm,
SELECT orapdt, oraptm, orodr#,
 ...
WHERE ( orapdt is null or TRANSLATE(SUBSTR(orapdt,1,LENGTH(orapdt)-1),' ','0123456789',' ') <>' ' ) AND
orstat != 'C' AND 
......