DB2嵌入式SQL在RPGLE中

时间:2016-12-16 10:42:56

标签: sql db2 embedded db2-400 rpgle

让我们假设我们有这个查询:

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,但如果我有数百个字段会怎么样?!
另一种方法是使用两个不同的查询。但如果我想要一个游标,这很难看。

有更好的方法吗?

1 个答案:

答案 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 *被认为是个坏主意。你应该有一个明确的列列表。这样,有人可以在以后添加一个列,而不会破坏您的代码。