视图中子选择的多行串联中的数据转换或数据映射错误HY000

时间:2019-05-13 15:01:27

标签: sql db2 db2-400

我有一个子选择作为视图的一部分,该视图从子表生成属性的级联列表。从视图中进行选择时,数据显示正常,但是如果在串联列表字段中进行选择,则有时会出现错误选择或在字段上忽略错误。

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:

select MSGOCCID, COALESCE(DETLIST,' ') 
from WBVIEW MSGP 
where 1=1 

If返回没有错误的所有行。

示例输出:

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),'-'),Both,''))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和''值....

我在许多不同的站点上搜索了很多主题,并且用尽了思路。
任何建议将不胜感激。

3 个答案:

答案 0 :(得分:0)

我只是在这里猜测一个简短的评论答案。这些左外部联接可以将null引入混合,您只需在where子句中将它们合并即可。

选择MSGOCCID,COALESCE(DETLIST,'') 从WBVIEW MSGP那里 Coalesce(DETLIST,'')就像'%4179792C%'

IRL我将使用locate,因为它运行时感觉更快。

选择MSGOCCID,COALESCE(DETLIST,'') 从WBVIEW MSGP那里 定位('4179792C',coalesce(DETLIST,''))<> 0

答案 1 :(得分:0)

HY000是一个CLI(ODBC)常规错误,IBM文档中的解释是:

  

发生了一个错误,该错误没有特定的SQLSTATE,也没有定义实现定义的SQLSTATE。 SQLError在参数szErrorMsg中返回的错误消息描述了错误及其原因。

由于这不是您手动编写的内容,因此您可能没有机会发出SQLError,但是我怀疑您在问题中引用的消息是某些内部过程检索该错误的结果。所以问题应该是:

  

数据转换或数据映射错误。

     

选择或忽略MapXmlData(Cast(Concat(',   ',Strip(Replace(Cast(P6MSDPF_4.FIELDVAL AS VarChar(128)CCSID 1208),'-'),Both,''))AS VarChar(260)CCSID 1208))成员COMMSWKBL1。选择/忽略成员COMMSWKBL1上的错误。

我不知道您的文件,但是我猜测文件中有错误数据,并且在将select logical添加到文件中时,COMMSWKBL1是DETLIST like '%4179792C%'可以访问以处理选择内容您的查询。您的任务是找出与成员COMMSWKBL1关联的文件,并查看您是否可以确定该文件为什么会发生“选择”或“忽略”错误。

答案 2 :(得分:0)

很好。我修改了视图以选择标题和详细信息,并搜索两个实体条目(链接在键MSGOCCID上),并对键MSGOCCID进行DISTINCT。似乎比问题的观点要慢一些,但效果很好。谢谢您的时间。