【发布时间】:2019-09-30 13:45:53
【问题描述】:
我有一个子选择作为视图的一部分,它从子表中生成连接的属性列表。从视图中进行选择时,数据显示正常,但如果它在串联列表字段中进行选择,我有时会收到错误 Select or omit error on field。
AS400:V7R1M0
主要实体:
MSGOCCID : CHAR 20
other fields.....
详细实体字段 (MSDPF):
MSGOCCID : CHAR 20
OCC : Integer 4
FIELDVAL : VARCHAR 128
我从 StackOverflow 获得了子选择的代码,并根据我的情况对其进行了修改。 (我也尝试过递归选择,但速度很慢。XMLSERIALIZE 路由是可执行的。)
为了尝试解决问题,它添加和删除了值的 REPLACE、COALESCE 和 TRIM。我已将 CCSID 1208 添加到演员表中,将 CHAR 演员表更改为 VARCHAR ......没有改变。 (我已经在某个阶段将 CCSID 1208 更改为 CCSID 37,看看是否不能解决问题。)
如果我运行选择:
select MSGOCCID, COALESCE(DETLIST,' ')
from WBVIEW MSGP
where 1=1
如果返回所有没有错误的行。
样本输出:
MSGOCCID: 2019020443165590 MSGDLIST: 14620, 1, C20180914023575582, 4179792C, C20180914023575582, 4179792C, WIPSTOCK, REMOVE, ROU07561
但如果我使用:
select MSGOCCID, COALESCE(DETLIST,' ')
from WBVIEW MSGP where 1=1 and DETLIST like '%4179792C%'
在 IBM 后端失败:
数据转换或数据映射错误。
选择或省略字段 MapXmlData(Cast(Concat(',
',Strip(Replace(Cast(P6MSDPF_4.FIELDVAL AS VarChar(128) CCSID 1208),'-'), 两者,' ')) AS VarChar(260) CCSID 1208)) 成员 COMMSWKBL1。成员 COMMSWKBL1 上的选择/省略错误。
视图的简短版本:
CREATE VIEW WBVIEW (
MSGOCCID ,
DETLIST )
AS
(SELECT MSG.MSGOCCID,
FROM P6DEVCDB00.P6MSGPF MSG
LEFT OUTER JOIN LATERAL
(SELECT XMLSERIALIZE(XMLAGG(XMLTEXT(CONCAT(', ',TRIM(REPLACE(REPLACE(REPLACE(FIELDVAL,',','-'),'>','-'),'<','-'))))) AS VARCHAR(4096) CCSID 1208) AS DETLIST
FROM MSDPF MSGDET
WHERE COALESCE(MSGDET.MSGOCCID,' ') != ' ' and
MSG.MSGOCCID = MSGDET.MSGOCCID AND
MSGDET.FIELDVAL != ''
GROUP BY MSGDET.MSGOCCID)MSGDLIST ON 1=1);
字符连接应该不是问题(除非它在某处与 CCSID 混淆)。我替换了 ,形成了可能干扰 xml 函数的详细信息...我已经满足了 Null 和 '' 值 ....
我在很多不同的网站上搜索了很多主题,但已经没有想法了。
任何建议将不胜感激。
【问题讨论】:
-
请编辑您的问题以添加您的 Db2 客户端软件的确切版本(和修订包),以及提交 SQL 的操作系统和工具。
-
你写它失败了,但是 HY000 是一个警告(不是错误)。根据ibm.com/support/knowledgecenter/en/ssw_ibm_i_74/rzala/… 的描述,是否有与 SQLCODE 一起出现的子代码(例如 +802,错误类型值为 1 到 12 )
-
我要提到的是,在连接字段上尝试
LIKE(在大多数文本字段上,但尤其是在这个字段上,你正在做多少到它)将执行非常。你最好做一些事情,比如找出哪个MSGOCCIDs 有相关的标签(可能通过写一个table valued function),然后根据它获取列表。此外,鉴于 null 比较规则,您不应该需要COALESCE(MSGDET.MSGOCCID,' ') != ' '。 -
1.我确实在问题中添加了 AS400: V7R1M0。你还需要什么?我正在使用 odbc 通过 SQLblockfetch 函数访问视图以连接到数据库。即使我使用 IBM Data Studio,我也会收到错误并且没有返回数据。
-
2. HY000 是作业日志中绿屏上的唯一代码,并在 ODBC 错误窗口中返回。没有其他错误代码返回被引用。