首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RPGLE中的DB2嵌入式SQL

RPGLE中的DB2嵌入式SQL
EN

Stack Overflow用户
提问于 2016-12-16 10:42:56
回答 1查看 962关注 0票数 1

让我们假设我们有这样的查询:

代码语言:javascript
复制
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记录不存在,会发生什么?

代码语言:javascript
复制
SQLCOD -305 THE NULL VALUE CANNOT BE ASSIGNED TO OUTPUT HOST VARIABLE

即使找到了来自FILE1的记录,DS也是空的!这是个问题。

克服这一问题的一种方法是在每个字段上使用COALESCE,但是如果我有数百个字段呢?!

另一种方法是使用两个不同的查询。但如果我想要游标的话那就太难看了。

有更好的办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-16 13:59:10

如果有可能为空的列,则必须传入一个整数变量才能用作空指示符。然后,如果结果列的值为null,则SQL在指示器变量中放入a-1。

使用左联接,右侧表中的每一列都可能为空。

手册有以下示例:

代码语言:javascript
复制
EXEC SQL
   SELECT COUNT(*), AVG(SALARY)
   INTO :PLICNT, :PLISAL:INDNULL
   FROM CORPDATA.EMPLOYEE
   WHERE EDLEVEL < 18

注意,在支持null的PLISAL和INDNULL之间没有逗号。

在处理数据结构时,可以传入空指示符数组。所以你的代码应该是这样的:

代码语言:javascript
复制
// 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 *被认为是个坏主意。您应该有一个明确的列列表。这样,以后就可以有人在您的表中添加一列,而不会破坏您的代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41182606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档