【问题标题】:Data conversion or data mapping error HY000 in multi row concatenation in sub select in view视图中的子选择中的多行连接中的数据转换或数据映射错误 HY000
【发布时间】: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 错误窗口中返回。没有其他错误代码返回被引用。

标签: sql db2 db2-400


【解决方案1】:

我只是在这里猜测一个快速的评论答案。那些左外连接可以将空值引入混合中,您可以简单地将它们合并到 where 子句中......

选择 MSGOCCID, COALESCE(DETLIST,' ') 从 WBVIEW MSGP 那里 coalesce(DETLIST,' ') like '%4179792C%'

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

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

【讨论】:

  • 我已经测试了 LOCATE 与 LIKE,并且使用 LIKE 和 LOCATE 一样更快地得到错误。 (我做了 3 次测试。)
【解决方案2】:

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 上的选择/省略错误。

我不知道您的文件,但我猜测文件中有错误数据,并且 COMMSWKBL1 是一个select logical,当您将DETLIST like '%4179792C%' 添加到您的查询时,可以访问它来处理选择。您的任务是找出与成员 COMMSWKBL1 关联的文件,并查看您能否确定为什么该文件会出现 Select 或 omit 错误。

【讨论】:

  • 是的。这就是我正在做的,但没有选择。我检查了数据,添加了 null 和 '' 处理,替换了可能会干扰 xml 函数的字符,确保在进行强制转换时使用相同的 CCSID,并确保不会发生数据截断。通常在作业日志中有一个可以检查和引用的错误代码,但在这种情况下没有特定代码。我已将 XMLTEXT 的函数输入减少到最低限度并得到相同的错误。似乎 XMLTEXT 在内部使用 MapXmlData 并且这给出了错误....
【解决方案3】:

没关系。我修改了视图以选择标题和详细信息,并搜索两个实体条目(链接在键 MSGOCCID 上)并在键 MSGOCCID 上执行 DISTINCT。它似乎比问题所涉及的视图慢一点,但工作正常。谢谢你的时间。

【讨论】:

    猜你喜欢
    • 2018-03-16
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多