执行此查询时
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
可能导致错误的原因是什么?
递归查询的结果集属性是根据第一个子查询确定的,所以在这种情况下:
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
...