连接字符的递归查询中出现“值...太长”错误

问题描述 投票:0回答:1

执行此查询时

     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)

我收到这个错误:

值 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

可能导致错误的原因是什么?

sql db2 common-table-expression db2-zos
1个回答
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_STRING
VARCHAR(1)
,因此当您尝试在递归部分为其分配更长的值时,它会失败。

您需要将

DOC_STRING
显式转换为适当的类型:

B (DOC_STRING,ROW_NUM) AS 
(SELECT CAST(DOC_STRING AS VARCHAR(140)),ROW_NUM 
   FROM A
 ...
© www.soinside.com 2019 - 2024. All rights reserved.