Oracle Apex 将多个 JSON 请求格式化为一个
Oracle Apex format multiple JSON requests to one
我写了一个 PL/SQL 代码,它请求 Dremio 服务并接收 JSON 和数据库输出。
输出保存到 REST_COLLECTION clob。
输出将显示在 APEX-Page 中。
这个 Dremio 服务的问题是,我一次只能接收 500 数据。
解决方案是一个循环和每次结果的连接.....
这就是我遇到的问题。
JSON 看起来像这样:
{"rowCount":307,"schema":[{"name":"EXPORTDATUM","type":{"name":"DATE"}},
{"name":"DOKUMENTE","type":{"name":"DOUBLE"}},{"name":"SEITEN","type":{"name":"DOUBLE"}},
{"name":"STAPELKLASSE","type":{"name":"VARCHAR"}},{"name":"FORMULAR","type"
{"name":"VARCHAR"}}],"rows":[{"EXPORTDATUM":"2019-02-04","DOKUMENTE":9.0,"SEITEN":37.0,"STAPELKLASSE":"TEST","FORMULAR":"TEST"}]}
每次连接 JSON 字符串都会导致页面视图出现 JSON 错误,因为有多个根元素。
SUBSTR 给定的字符串不是常见的方式,Dremio 输出可能会改变。
每次创建多个 clob 是可能的,但我的查询不知道 clob 的数量。
查询看起来像这样顺便说一句:
select
to_date(j."EXPORTDATUM", 'YYYY-MM-DD') as "EXPORTDATUM",
j."DOKUMENTE",
j."SEITEN",
j."STAPELKLASSE",
j."FORMULAR"
from apex_collections c, json_table(
c.clob001 format json,
'$.rows[*]'
columns (
"EXPORTDATUM" VARCHAR2(4000) path '$.EXPORTDATUM',
"DOKUMENTE" VARCHAR2(4000) path '$.DOKUMENTE',
"SEITEN" VARCHAR2(4000) path '$.SEITEN',
"STAPELKLASSE" VARCHAR2(4000) path '$.STAPELKLASSE',
"FORMULAR" VARCHAR2(4000) path '$.FORMULAR'
)
) j
where c.collection_name = 'REST_COLLECTION'
我希望有一个没有子字符串的连接多个 JSON 的解决方案。
为了模仿集合中的 JSON 行,我使用 Union 创建了一个简单的 SQL。
您可以使用 APEX_JSON API 生成 JSON 文档。
以下是可以帮助您入门的示例代码。您只需稍作更改即可满足您的要求。
declare
l_json clob;
begin
apex_json.initialize_clob_output;
apex_json.open_array;
for rec in (select * from(
select
to_date(j."EXPORTDATUM", 'YYYY-MM-DD') as "EXPORTDATUM",
j."DOKUMENTE",
j."SEITEN",
j."STAPELKLASSE",
j."FORMULAR"
from json_table(
'{
"rowCount": 307,
"schema": [{
"name": "EXPORTDATUM",
"type": {
"name": "DATE"
}
},
{
"name": "DOKUMENTE",
"type": {
"name": "DOUBLE"
}
}, {
"name": "SEITEN",
"type": {
"name": "DOUBLE"
}
},
{
"name": "STAPELKLASSE",
"type": {
"name": "VARCHAR"
}
}, {
"name": "FORMULAR",
"type": {
"name": "VARCHAR"
}
}
],
"rows": [{
"EXPORTDATUM": "2019-02-04",
"DOKUMENTE": 9.0,
"SEITEN": 37.0,
"STAPELKLASSE": "row1",
"FORMULAR": "row1"
},
{
"EXPORTDATUM": "2019-02-04",
"DOKUMENTE": 9.0,
"SEITEN": 37.0,
"STAPELKLASSE": "row2",
"FORMULAR": "row2"
}]
}' format json,
'$.rows[*]'
columns (
"EXPORTDATUM" VARCHAR2(4000) path '$.EXPORTDATUM',
"DOKUMENTE" VARCHAR2(4000) path '$.DOKUMENTE',
"SEITEN" VARCHAR2(4000) path '$.SEITEN',
"STAPELKLASSE" VARCHAR2(4000) path '$.STAPELKLASSE',
"FORMULAR" VARCHAR2(4000) path '$.FORMULAR'
)
) j
union all
select
to_date(j."EXPORTDATUM", 'YYYY-MM-DD') as "EXPORTDATUM",
j."DOKUMENTE",
j."SEITEN",
j."STAPELKLASSE",
j."FORMULAR"
from json_table(
'{
"rowCount": 307,
"schema": [{
"name": "EXPORTDATUM",
"type": {
"name": "DATE"
}
},
{
"name": "DOKUMENTE",
"type": {
"name": "DOUBLE"
}
}, {
"name": "SEITEN",
"type": {
"name": "DOUBLE"
}
},
{
"name": "STAPELKLASSE",
"type": {
"name": "VARCHAR"
}
}, {
"name": "FORMULAR",
"type": {
"name": "VARCHAR"
}
}
],
"rows": [{
"EXPORTDATUM": "2019-02-04",
"DOKUMENTE": 9.0,
"SEITEN": 37.0,
"STAPELKLASSE": "row3",
"FORMULAR": "row3"
},
{
"EXPORTDATUM": "2019-02-04",
"DOKUMENTE": 9.0,
"SEITEN": 37.0,
"STAPELKLASSE": "row4",
"FORMULAR": "row4"
}]
}' format json,
'$.rows[*]'
columns (
"EXPORTDATUM" VARCHAR2(4000) path '$.EXPORTDATUM',
"DOKUMENTE" VARCHAR2(4000) path '$.DOKUMENTE',
"SEITEN" VARCHAR2(4000) path '$.SEITEN',
"STAPELKLASSE" VARCHAR2(4000) path '$.STAPELKLASSE',
"FORMULAR" VARCHAR2(4000) path '$.FORMULAR'
)
) j) )
loop
apex_json.open_object;
apex_json.write('EXPORTDATUM', rec.EXPORTDATUM);
apex_json.write('DOKUMENTE', rec.DOKUMENTE);
apex_json.write('SEITEN', rec.SEITEN);
apex_json.write('STAPELKLASSE', rec.STAPELKLASSE);
apex_json.write('FORMULAR', rec.FORMULAR);
apex_json.close_object;
end loop;
apex_json.close_array;
dbms_output.put_line(apex_json.get_clob_output( p_free => true ) );
end;
希望这能解决您的问题。
我写了一个 PL/SQL 代码,它请求 Dremio 服务并接收 JSON 和数据库输出。 输出保存到 REST_COLLECTION clob。 输出将显示在 APEX-Page 中。 这个 Dremio 服务的问题是,我一次只能接收 500 数据。 解决方案是一个循环和每次结果的连接..... 这就是我遇到的问题。
JSON 看起来像这样:
{"rowCount":307,"schema":[{"name":"EXPORTDATUM","type":{"name":"DATE"}},
{"name":"DOKUMENTE","type":{"name":"DOUBLE"}},{"name":"SEITEN","type":{"name":"DOUBLE"}},
{"name":"STAPELKLASSE","type":{"name":"VARCHAR"}},{"name":"FORMULAR","type"
{"name":"VARCHAR"}}],"rows":[{"EXPORTDATUM":"2019-02-04","DOKUMENTE":9.0,"SEITEN":37.0,"STAPELKLASSE":"TEST","FORMULAR":"TEST"}]}
每次连接 JSON 字符串都会导致页面视图出现 JSON 错误,因为有多个根元素。
SUBSTR 给定的字符串不是常见的方式,Dremio 输出可能会改变。
每次创建多个 clob 是可能的,但我的查询不知道 clob 的数量。 查询看起来像这样顺便说一句:
select
to_date(j."EXPORTDATUM", 'YYYY-MM-DD') as "EXPORTDATUM",
j."DOKUMENTE",
j."SEITEN",
j."STAPELKLASSE",
j."FORMULAR"
from apex_collections c, json_table(
c.clob001 format json,
'$.rows[*]'
columns (
"EXPORTDATUM" VARCHAR2(4000) path '$.EXPORTDATUM',
"DOKUMENTE" VARCHAR2(4000) path '$.DOKUMENTE',
"SEITEN" VARCHAR2(4000) path '$.SEITEN',
"STAPELKLASSE" VARCHAR2(4000) path '$.STAPELKLASSE',
"FORMULAR" VARCHAR2(4000) path '$.FORMULAR'
)
) j
where c.collection_name = 'REST_COLLECTION'
我希望有一个没有子字符串的连接多个 JSON 的解决方案。
为了模仿集合中的 JSON 行,我使用 Union 创建了一个简单的 SQL。
您可以使用 APEX_JSON API 生成 JSON 文档。
以下是可以帮助您入门的示例代码。您只需稍作更改即可满足您的要求。
declare
l_json clob;
begin
apex_json.initialize_clob_output;
apex_json.open_array;
for rec in (select * from(
select
to_date(j."EXPORTDATUM", 'YYYY-MM-DD') as "EXPORTDATUM",
j."DOKUMENTE",
j."SEITEN",
j."STAPELKLASSE",
j."FORMULAR"
from json_table(
'{
"rowCount": 307,
"schema": [{
"name": "EXPORTDATUM",
"type": {
"name": "DATE"
}
},
{
"name": "DOKUMENTE",
"type": {
"name": "DOUBLE"
}
}, {
"name": "SEITEN",
"type": {
"name": "DOUBLE"
}
},
{
"name": "STAPELKLASSE",
"type": {
"name": "VARCHAR"
}
}, {
"name": "FORMULAR",
"type": {
"name": "VARCHAR"
}
}
],
"rows": [{
"EXPORTDATUM": "2019-02-04",
"DOKUMENTE": 9.0,
"SEITEN": 37.0,
"STAPELKLASSE": "row1",
"FORMULAR": "row1"
},
{
"EXPORTDATUM": "2019-02-04",
"DOKUMENTE": 9.0,
"SEITEN": 37.0,
"STAPELKLASSE": "row2",
"FORMULAR": "row2"
}]
}' format json,
'$.rows[*]'
columns (
"EXPORTDATUM" VARCHAR2(4000) path '$.EXPORTDATUM',
"DOKUMENTE" VARCHAR2(4000) path '$.DOKUMENTE',
"SEITEN" VARCHAR2(4000) path '$.SEITEN',
"STAPELKLASSE" VARCHAR2(4000) path '$.STAPELKLASSE',
"FORMULAR" VARCHAR2(4000) path '$.FORMULAR'
)
) j
union all
select
to_date(j."EXPORTDATUM", 'YYYY-MM-DD') as "EXPORTDATUM",
j."DOKUMENTE",
j."SEITEN",
j."STAPELKLASSE",
j."FORMULAR"
from json_table(
'{
"rowCount": 307,
"schema": [{
"name": "EXPORTDATUM",
"type": {
"name": "DATE"
}
},
{
"name": "DOKUMENTE",
"type": {
"name": "DOUBLE"
}
}, {
"name": "SEITEN",
"type": {
"name": "DOUBLE"
}
},
{
"name": "STAPELKLASSE",
"type": {
"name": "VARCHAR"
}
}, {
"name": "FORMULAR",
"type": {
"name": "VARCHAR"
}
}
],
"rows": [{
"EXPORTDATUM": "2019-02-04",
"DOKUMENTE": 9.0,
"SEITEN": 37.0,
"STAPELKLASSE": "row3",
"FORMULAR": "row3"
},
{
"EXPORTDATUM": "2019-02-04",
"DOKUMENTE": 9.0,
"SEITEN": 37.0,
"STAPELKLASSE": "row4",
"FORMULAR": "row4"
}]
}' format json,
'$.rows[*]'
columns (
"EXPORTDATUM" VARCHAR2(4000) path '$.EXPORTDATUM',
"DOKUMENTE" VARCHAR2(4000) path '$.DOKUMENTE',
"SEITEN" VARCHAR2(4000) path '$.SEITEN',
"STAPELKLASSE" VARCHAR2(4000) path '$.STAPELKLASSE',
"FORMULAR" VARCHAR2(4000) path '$.FORMULAR'
)
) j) )
loop
apex_json.open_object;
apex_json.write('EXPORTDATUM', rec.EXPORTDATUM);
apex_json.write('DOKUMENTE', rec.DOKUMENTE);
apex_json.write('SEITEN', rec.SEITEN);
apex_json.write('STAPELKLASSE', rec.STAPELKLASSE);
apex_json.write('FORMULAR', rec.FORMULAR);
apex_json.close_object;
end loop;
apex_json.close_array;
dbms_output.put_line(apex_json.get_clob_output( p_free => true ) );
end;
希望这能解决您的问题。