【问题标题】:DB2 sql recursive concatenation errorDB2 sql递归串联错误
【发布时间】:2015-11-20 11:59:44
【问题描述】:

我没有找到类似的东西,所以我要解释一下我的麻烦......

执行此查询时

 WITH A (DOC_STRING,ROW_NUM) AS
    (SELECT CAST('A' AS VARCHAR(1)),1
           FROM SYSIBM.SYSDUMMY1
     UNION ALL
      SELECT CAST('B' AS VARCHAR(1)),2
           FROM SYSIBM.SYSDUMMY1 
     UNION ALL 
      SELECT CAST ('C' AS VARCHAR(1)),3
           FROM SYSIBM.SYSDUMMY1 )      
    ,C (MAX_NUM) AS
    (SELECT COUNT(*)  FROM A) 
    ,B (DOC_STRING,ROW_NUM) AS 
    (SELECT DOC_STRING,ROW_NUM 
       FROM A
      WHERE ROW_NUM = 1
    UNION ALL 
     SELECT CAST (
           CONCAT (B.DOC_STRING,A.DOC_STRING) 
           AS  VARCHAR(140)) 
           ,B.ROW_NUM
       FROM A,B,C
      WHERE A.ROW_NUM  = B.ROW_NUM + 1
        AND A.ROW_NUM  <= C.MAX_NUM
    )
    SELECT * FROM B
    WHERE ROW_NUM = (SELECT MAX(ROW_NUM) FROM A)

我收到错误: VALUE AB 太长 SQL 代码:-433,SQL 状态:22001

我在 IBM Data Studio 中启用了跟踪:

[jcc] BEGIN TRACE_DIAGNOSTICS
[jcc][Thread:Worker-28][SQLWarning@aaef651f] java.sql.SQLWarning
[jcc][Thread:Worker-28][SQLWarning@aaef651f][Sqlca@8c3bf3fb] DB2 SQLCA from server
[jcc][Thread:Worker-28][SQLWarning@aaef651f][Sqlca@8c3bf3fb] SqlCode        = 347
[jcc][Thread:Worker-28][SQLWarning@aaef651f][Sqlca@8c3bf3fb] SqlErrd        = { 0, 0, 53333, 1127202000, 0, 0 }
[jcc][Thread:Worker-28][SQLWarning@aaef651f][Sqlca@8c3bf3fb] SqlErrmc       = B
[jcc][Thread:Worker-28][SQLWarning@aaef651f][Sqlca@8c3bf3fb] SqlErrmcTokens = { B }
[jcc][Thread:Worker-28][SQLWarning@aaef651f][Sqlca@8c3bf3fb] SqlErrp        = DSNXODML
[jcc][Thread:Worker-28][SQLWarning@aaef651f][Sqlca@8c3bf3fb] SqlState       = 01605
[jcc][Thread:Worker-28][SQLWarning@aaef651f][Sqlca@8c3bf3fb] SqlWarn        =            
[jcc][Thread:Worker-28][SQLWarning@aaef651f] SQL state  = 01605
[jcc][Thread:Worker-28][SQLWarning@aaef651f] Error code = 347
[jcc][Thread:Worker-28][SQLWarning@aaef651f] Tokens     = B
[jcc][Thread:Worker-28][SQLWarning@aaef651f] Stack trace follows

[jcc] BEGIN TRACE_DIAGNOSTICS
[jcc][Thread:Worker-28][SQLException@11750c6c] java.sql.SQLException
[jcc][Thread:Worker-28][SQLException@11750c6c][Sqlca@a1af1729] DB2 SQLCA from server
[jcc][Thread:Worker-28][SQLException@11750c6c][Sqlca@a1af1729] SqlCode        = -433
[jcc][Thread:Worker-28][SQLException@11750c6c][Sqlca@a1af1729] SqlErrd        = { 1046, 0, 0, -1, 0, 0 }
[jcc][Thread:Worker-28][SQLException@11750c6c][Sqlca@a1af1729] SqlErrmc       = AB
[jcc][Thread:Worker-28][SQLException@11750c6c][Sqlca@a1af1729] SqlErrmcTokens = { AB }
[jcc][Thread:Worker-28][SQLException@11750c6c][Sqlca@a1af1729] SqlErrp        = DSNXRSBC
[jcc][Thread:Worker-28][SQLException@11750c6c][Sqlca@a1af1729] SqlState       = 22001
[jcc][Thread:Worker-28][SQLException@11750c6c][Sqlca@a1af1729] SqlWarn        =            
[jcc][Thread:Worker-28][SQLException@11750c6c] SQL state  = 22001
[jcc][Thread:Worker-28][SQLException@11750c6c] Error code = -433
[jcc][Thread:Worker-28][SQLException@11750c6c] Tokens     = AB

有什么想法吗?

谢谢!

【问题讨论】:

  • 什么 DB2 版本和平台?
  • 您好 mustaccio,我正在使用 DB2 9 for z/Os...
  • 在 DB2 上,VALUES(...) 可用于返回多行(并且您不需要对 sysdummy 的引用)。您根本不需要 C 表引用 - 一旦没有“下一个”行,就不会返回更多行。哦,首选语法是明确指定 JOIN s - 请不要使用隐式连接(逗号分隔的 FROM 子句)语法。

标签: sql db2 common-table-expression


【解决方案1】:

递归查询的结果集属性是根据第一个子选择确定的,所以在这种情况下:

B (DOC_STRING,ROW_NUM) AS 
(SELECT DOC_STRING,ROW_NUM -- this one determines result set data types
   FROM A
  WHERE ROW_NUM = 1
UNION ALL 
 SELECT CAST (
       CONCAT (B.DOC_STRING,A.DOC_STRING) 
       AS  VARCHAR(140)) 
       ,B.ROW_NUM
   FROM A,B,C
 ...

DOC_STRINGVARCHAR(1),因此当您尝试在递归部分为其分配更长的值时,它会失败。

您需要将DOC_STRING 显式转换为适当的类型:

B (DOC_STRING,ROW_NUM) AS 
(SELECT CAST(DOC_STRING AS VARCHAR(140)),ROW_NUM 
   FROM A
 ...

【讨论】:

  • 谢谢mustaccio,我已根据您的评论更改了查询,但仍然出错:VALUE ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB 太长 SQL 代码:-433,SQL 状态:22001
  • 您的查询似乎有一个无限循环,因此在 140 次迭代后,连接结果将不适合 VARCHAR(140)
  • 更改 SELECT CONCAT (B.DOC_STRING,A.DOC_STRING) 中的第二个查询,B.ROW_NUM + 1 FROM A,B,C WHERE A.ROW_NUM = B.ROW_NUM + 1 AND B.ROW_NUM
猜你喜欢
  • 1970-01-01
  • 2015-02-02
  • 2016-12-05
  • 2021-05-28
  • 2017-08-14
  • 1970-01-01
相关资源
最近更新 更多