让我们假设我们有这个查询:
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
,但如果我有数百个字段会怎么样?!
另一种方法是使用两个不同的查询。但如果我想要一个游标,这很难看。
有更好的方法吗?
答案 0 :(得分:3)
如果您的列可能为NULL,则必须传入一个整型变量以用作NULL指示符。然后,如果结果列的值为null,则SQL在指示符变量中放置-1。
使用LEFT JOIN,右表中的每一列都可以为NULL。
manual有以下示例:
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 *
被认为是个坏主意。你应该有一个明确的列列表。这样,有人可以在以后添加一个列,而不会破坏您的代码。