请求的json格式如下:
{
"header": {
"InstanceName": "US"
},
"erpReferenceData": {
"erpReferences": [
{
"ServiceID": "fb16e421-792b-4e9c-935b-3cea04a84507",
"ERPReferenceID": "J0000755"
},
{
"ServiceID": "7d13d907-0932-44c0-ad81-600c9b97b6e5",
"ERPReferenceID": "J0000756"
}
]
}
}
我创建的程序如下所示:
dcl-s OutFile sqltype(dbclob_file);
exec sql
With x as (
select json_object(
'InstanceName' : trim(Cntry) ) objHeader
from xmlhdr
where cntry = 'US'),
y as (
select json_object(
'ServiceID' VALUE S.ServiceID,
'ERPReferenceID' VALUE I.RefCod) oOjRef
FROM IMH I
INNER JOIN GUIDS G ON G.REFCOD = I.REFCOD
INNER JOIN SERV S ON S.GUID = G.GUID
WHERE G.XMLTYPE = 'Service')
VALUES (
select json_object('header' : objHeader Format json ,
'erpReferenceData' : json_object(
'erpReferences' VALUE
JSON_ARRAYAGG(
ObjRef Format json)))
from x
LEFT OUTER JOIN y ON 1=1
Group by objHeader)
INTO :OutFile;
这是我得到的编译错误:
sql0122:选择列表中的位置41列objheader或表达式无效。
我在问,这是否是创建这个sql语句的正确方法,有没有更好的方法?知道如何重写sql语句以使其正常工作吗?
1条答案
按热度按时间nwsw7zdq1#
生成json或xml的关键是从内部开始,然后解决问题。
(我将原始数据简化为一个测试表…)
现在将下一层作为cte添加到第一个cte的基础上。。
下一层。。。
用cte建房的好处是在每一步,你都可以看到目前为止的结果。。。
其实你可以随时回去
Select * from CTE;
在中间看看你在某个时候有什么。请注意,我是在运行sql脚本中构建的。完成语句后,可以将其嵌入rpg程序中。