GM, я пишу программу SQLRPGLE, которая будет использовать DB2 SQL для генерации файлов XML в IFS. Я смог проверить теорию с помощью стандартного SQL (выберите ....) и сгенерировать XML-файл в IFS, используя значения..into.
Когда я попытался расширить это с помощью CTE со значениями..into, я получил синтаксическую ошибку
SQL0104 Token WITH was not valid. Valid tokens: (
Мой вопрос: можно ли использовать CTE с Values..into? и если да, то что я делаю не так? (код ниже). Также. Я знаю, что есть другие, возможно, более подходящие способы сделать это. Но это было то, с чем я недавно столкнулся и хотел попробовать, чтобы увидеть, можно ли что-то добавить в список техник. Но с появлением этой ошибки мне, возможно, придется перейти к чему-то другому ...
exec sql VALUES(
With Stylemaster as (
SELECT CPY007, DIV007, SEY007, KYS007, CC#007, SST007, STD007,
FAB007, LEN007, SCT007, CGP007, DLV007, RPR007, PC1007, PC3007,
STS007, DCD007, SDA007, SDB007, SDC007, SDD007, SDE007, SDF007,
SDG007, PI1007, PI2007, PI3007, PI4007, PI5007, PI6007, PI7007,
PI8007, CDEC07, SCALE, INVALID, IDX, COLOR, SKU100, SKU200,
SKU300, SKU400,CPY, SINDEX, SZS, DES, S01, P01, N01, B01, ASZ, AS2
FROM ((SELECT CPY007, DIV007, SEY007, KYS007, CC#007, SST007, STD007,
FAB007, LEN007, SCT007, CGP007, DLV007, RPR007, PC1007, PC3007,
STS007, DCD007, SDA007, SDB007, SDC007, SDD007, SDE007, SDF007,
SDG007, PI1007, PI2007, PI3007, PI4007, PI5007, PI6007, PI7007,
PI8007, CDEC07, SCALE, INVALID, IDX, COLOR
FROM DRLMFILES.pst007 t,
LATERAL (VALUES (SSC007, SUBSTR(SZO007, 01, 1), 01),
(SSC007, SUBSTR(SZO007, 02, 1), 02),
(SSC007, SUBSTR(SZO007, 03, 1), 03),
(SSC007, SUBSTR(SZO007, 04, 1), 04),
(SSC007, SUBSTR(SZO007, 05, 1), 05),
(SSC007, SUBSTR(SZO007, 06, 1), 06),
(SSC007, SUBSTR(SZO007, 07, 1), 07),
(SSC007, SUBSTR(SZO007, 08, 1), 08),
(SSC007, SUBSTR(SZO007, 09, 1), 09),
(SSC007, SUBSTR(SZO007, 10, 1), 10),
(SSD007, SUBSTR(SZO007, 11, 1), 01),
(SSD007, SUBSTR(SZO007, 12, 1), 02),
(SSD007, SUBSTR(SZO007, 13, 1), 03),
(SSD007, SUBSTR(SZO007, 14, 1), 04),
(SSD007, SUBSTR(SZO007, 15, 1), 05),
(SSD007, SUBSTR(SZO007, 16, 1), 06),
(SSD007, SUBSTR(SZO007, 17, 1), 07),
(SSD007, SUBSTR(SZO007, 18, 1), 08),
(SSD007, SUBSTR(SZO007, 19, 1), 09),
(SSD007, SUBSTR(SZO007, 20, 1), 10),
(SSE007, SUBSTR(SZO007, 21, 1), 01),
(SSE007, SUBSTR(SZO007, 22, 1), 02),
(SSE007, SUBSTR(SZO007, 23, 1), 03),
(SSE007, SUBSTR(SZO007, 24, 1), 04),
(SSE007, SUBSTR(SZO007, 25, 1), 05),
(SSE007, SUBSTR(SZO007, 26, 1), 06),
(SSE007, SUBSTR(SZO007, 27, 1), 07),
(SSE007, SUBSTR(SZO007, 28, 1), 08),
(SSE007, SUBSTR(SZO007, 29, 1), 09),
(SSE007, SUBSTR(SZO007, 30, 1), 10))
AS D(SCALE, INVALID, IDX),
LATERAL (VALUES (CL0107),(CL0207),(CL0307),(CL0407),(CL0507),
(CL0607),(CL0707),(CL0807),(CL0907),(CL1007),
(CL1107),(CL1207),(CL1307),(CL1407),(CL1507),
(CL1607),(CL1707),(CL1807),(CL1907),(CL2007),
(CL2107),(CL2207),(CL2307),(CL2407),(CL2507),
(CL2607),(CL2707),(CL2807),(CL2907),(CL3007),
(CL3607),(CL3707),(CL3807),(CL3907),(CL4007),
(LEN007))
AS E(COLOR)
WHERE SCALE <> ' ' AND INVALID <> 'X' AND COLOR <> ' ') S
JOIN (SELECT CPY, SZS, DES, SINDEX, S01, P01, N01, B01, ASZ, AS2
FROM DRLMFILES.PGI538 T,
LATERAL (VALUES (CPY538, 01, SZS538, DES538, S01538,
P01538, N01538, B01538, ASZ538, AS2538),
(CPY538, 02, SZS538, DES538, S02538,
P02538, N02538, B02538, ASZ538, AS2538),
(CPY538, 03, SZS538, DES538, S03538,
P03538, N03538, B03538, ASZ538, AS2538),
(CPY538, 04, SZS538, DES538, S04538,
P04538, N04538, B04538, ASZ538, AS2538),
(CPY538, 05, SZS538, DES538, S05538,
P05538, N05538, B05538, ASZ538, AS2538),
(CPY538, 06, SZS538, DES538, S06538,
P06538, N06538, B06538, ASZ538, AS2538),
(CPY538, 07, SZS538, DES538, S07538,
P07538, N07538, B07538, ASZ538, AS2538),
(CPY538, 08, SZS538, DES538, S08538,
P08538, N08538, B08538, ASZ538, AS2538),
(CPY538, 09, SZS538, DES538, S09538,
P09538, N09538, B09538, ASZ538, AS2538),
(CPY538, 10, SZS538, DES538, S10538,
P10538, N10538, B10538, ASZ538, AS2538))
AS STYLE(CPY, SINDEX, SZS, DES, S01, P01, N01, B01, ASZ, AS2)
WHERE S01 <> ' '
ORDER BY CPY, SINDEX, SZS, DES, S01, P01, N01, B01, ASZ, AS2)
SC ON S.CPY007 = SC.CPY AND S.SCALE = SC.SZS AND S.IDX = SC.SINDEX)
JOIN TRLMFILES.PDIV000 DD on S.CPY007 = COMP00 and S.DIV007 = DIVI00
GROUP BY CPY007, DIV007, SEY007, KYS007, CC#007, SST007, STD007,
FAB007, LEN007, SCT007, CGP007, DLV007, RPR007, PC1007, PC3007, STS007,
DCD007, SDA007, SDB007, SDC007, SDD007, SDE007, SDF007, SDG007, PI1007,
SZS, PI2007, PI3007, PI4007, PI5007, PI6007, PI7007, PI8007, CDEC07,
SCALE, INVALID, IDX, COLOR, S01, SKU100, SKU200, SKU300, SKU400, CPY,
SINDEX, SZS, DES, S01, P01, N01, B01, ASZ, AS2
ORDER BY CPY007, DIV007, SEY007, KYS007, CC#007, SST007, STD007,
FAB007, LEN007, SCT007, CGP007, DLV007, RPR007, PC1007, PC3007, STS007,
DCD007, SDA007, SDB007, SDC007, SDD007, SDE007, SDF007, SDG007, PI1007,
SZS, PI2007, PI3007, PI4007, PI5007, PI6007, PI7007, PI8007, CDEC07,
SCALE, INVALID, IDX, COLOR, S01),
UPCMaster as
(SELECT (DIGITS(INF004) ||
DIGITS(MFG004) ||
DIGITS(UPC004) ||
DIGITS(CKD004)) as UPC,
SKU004 ,
FAB004 as Fabric,
LEN004 as Length,
SIZ004 as Size,
CASE WHEN SIZ004 = 'PPK' THEN LEN004
WHEN FAB004 = 'PR' THEN LEN004
WHEN FAB004 = 'EA' THEN LEN004
ELSE CLR004
END as ColorCode,
SSC004 as Sizescale,
IDX004 as Index from DRLMFILES.PUP004
WHERE SKU004 =INT(2307502))
SELECT
XMLElement(name "Style",
XMLAttributes(CPY007 as Company,
DIV007 as Division,
CC#007 as SKU_number,
Color as Color ),
XMLForest(CPY007 as Company,
DIV007 as Division,
SEY007 as Seasonyear,
KYS007 as Season,
CC#007 as SKU_number,
SST007 as Style,
STD007 as Style_desc,
FAB007 as Fabric,
LEN007 as Length,
CGP007 as Group_Code,
DLV007 as Delv_code,
RPR007 as Sugretprc,
PC1007 as standprice,
PC3007 as euro_cosdt,
STS007 as pack_hang,
DCD007 as style_dsc,
SDA007 as styledesc2,
SDB007 as styledesc3,
SDC007 as styledesc4,
SDD007 as styledesc5,
SDE007 as styledesc6,
SDF007 as styledesc7,
SDG007 as styledesc8,
PI1007 as footupper,
PI2007 as footsole,
PI3007 as htscode,
PI4007 as packinstr4,
PI5007 as packinstr5,
PI6007 as packinstr6,
PI7007 as packinstr7,
PI8007 as packinstr8,
CDEC07 as citesstyle,
XMLAGG( XMLELEMENT(name UPCNUMBER,
XMLForest(Index,
UPC,
Fabric,
Length,
Size,
ColorCode ))
ORDER BY UPC, SIZE) as "UPCS" ))
FROM StyleMaster AAA join UPCMaster BBB on
CC#007 = SKU004 and
Color = ColorCode and
SZS = SizeScale and IDX = Index
GROUP BY CPY007, DIV007, SEY007, KYS007, CC#007, SST007, STD007,
FAB007, LEN007, SCT007, CGP007, DLV007, RPR007, PC1007,
PC3007, STS007, DCD007, SDA007, SDB007, SDC007, SDD007,
SDE007, SDF007, SDG007, PI1007, PI2007, PI3007, PI4007,
PI5007, PI6007, PI7007, PI8007, CDEC07, COLOR
ORDER BY CPY007, DIV007, SEY007, KYS007, CC#007, SST007, STD007,
FAB007, LEN007, SCT007, CGP007, DLV007, RPR007, PC1007,
PC3007, STS007, DCD007, SDA007, SDB007, SDC007, SDD007,
SDE007, SDF007, SDG007, PI1007, PI2007, PI3007, PI4007,
PI5007, PI6007, PI7007, PI8007, CDEC07, COLOR)
INTO :Outfile ;


В следующий раз подумайте о том, чтобы собрать более простую версию, демонстрирующую проблему ...
exec sql
values (with cte as (select current_timestamp(8)
from sysibm.sysdummy1
)
select * from cte
)
into :ts;
Та же ошибка, что меня удивляет ... но, читая документация для VALUES INTO, он говорит ...
row-fullselect
A fullselect that returns a single result row. The result column values are assigned to each corresponding variable. If the result of the fullselect is no rows, then null values are assigned. An error is returned if there is more than one row in the result.
полный выбор - это не то же самое, что оператор выбора, который позволяет CTE на эта страница
fullselect
The fullselect is a component of the select-statement
Подумайте о создании представления для оператор выбора, тогда ваш встроенный код станет просто:
exec sql
values (select * from myview) into :outfile;
Чарльз, извини за это. В будущем я минимизирую код, когда это возможно. Я думал, что полный код будет более информативным, так как я был потерян в том, в чем была проблема.
Хотя я все еще озадачен. Когда я проводил свой первоначальный тест (без CTE (тогда это было намного проще), у меня не было этой проблемы. Код (поскольку это объект XML) возвращает только одну строку. Я думал, что это удовлетворяет требованию одной строки. Позвольте мне провести еще несколько тестов ....
Чтобы получить немного больше пояснений, вы также можете взглянуть на страницу оператора выбора здесь. Обратите внимание, что CTE использует полную выборку, но не является ее частью.