让我们假设我们有这样的查询:
SELECT T1.*, T2.* INTO :DS1, :DS2 FROM FILE1 AS T1
LEFT JOIN FILE2 AS T2 ON T1.KEY = T2.KEY
FETCH FIRST 1 ROW ONLY如果两份记录都找到了,一切都会好起来。但是,如果FILE2记录不存在,会发生什么?
SQLCOD -305 THE NULL VALUE CANNOT BE ASSIGNED TO OUTPUT HOST VARIABLE即使找到了来自FILE1的记录,DS也是空的!这是个问题。
克服这一问题的一种方法是在每个字段上使用COALESCE,但是如果我有数百个字段呢?!
另一种方法是使用两个不同的查询。但如果我想要游标的话那就太难看了。
有更好的办法吗?
发布于 2016-12-16 13:59:10
如果有可能为空的列,则必须传入一个整数变量才能用作空指示符。然后,如果结果列的值为null,则SQL在指示器变量中放入a-1。
使用左联接,右侧表中的每一列都可能为空。
手册有以下示例:
EXEC SQL
SELECT COUNT(*), AVG(SALARY)
INTO :PLICNT, :PLISAL:INDNULL
FROM CORPDATA.EMPLOYEE
WHERE EDLEVEL < 18注意,在支持null的PLISAL和INDNULL之间没有逗号。
在处理数据结构时,可以传入空指示符数组。所以你的代码应该是这样的:
// xx should be the number of columns in T2
dcl-s indArr int(5) dim(xx);
exec sql
SELECT T1.*, T2.* INTO :DS1, :DS2 :indArr
FROM FILE1 AS T1
LEFT JOIN FILE2 AS T2 ON T1.KEY = T2.KEY
FETCH FIRST 1 ROW ONLY;作为一个FYI:在生产代码中使用SELECT *被认为是个坏主意。您应该有一个明确的列列表。这样,以后就可以有人在您的表中添加一列,而不会破坏您的代码。
https://stackoverflow.com/questions/41182606
复制相似问题