如何解析此 JSON 以填充到 APEX 集合中并按日期排序
How to parse this JSON to populate into APEX Collection and sort by date
我在 JSON
下面使用 Oracle 11gR2 数据库中的 APEX_JSON
进行解析。
我的要求是按 closed_at
对日期进行排序并选择最新的 close_reason。我正在考虑将 closed_at
和 close_reason
填充到 APEX 集合中。将日期按 apex_collections 降序排序以选择最新的 close_reason
.
你能帮忙写下 APEX_JSON.get_count
和 APEX_JSON.get_varchar2
来获取 closed_at
和 close_reason
.
{"openings": [{
"id": 5003,
"opening_id": null,
"status": "closed",
"opened_at": "2020-11-30T20:09:56.487Z",
"closed_at": "2020-12-02T22:43:45.736Z",
"application_id": 76370003,
"close_reason": null
}, {
"id": 8003,
"opening_id": null,
"status": "closed",
"opened_at": "2020-11-30T20:59:02.267Z",
"closed_at": "2020-12-04T11:07:26.087Z",
"application_id": 45990003,
"close_reason": {
"id": 7003,
"name": "Hire - New Headcount"
}
}
]
}
谢谢
基肖尔
在使用APEX_JSON.GET_VARCHAR2()
之前,需要在PL/SQL代码中解析APEX_JSON.PARSE()
。而不是使用 PL/SQL,SQL 可能会通过使用 XMLTABLE
直接使用,例如
WITH t1 AS
(
SELECT APEX_JSON.TO_XMLTYPE(jsdata) AS xml_data
FROM t0 -- suppose your json data is inserted into jsdata column of this table
), t2 AS
(
SELECT close_reason,
ROW_NUMBER() OVER
(ORDER BY TO_TIMESTAMP(closed_at, 'yyyy-mm-dd"T"hh24:mi:ss.ff"Z"') DESC) AS rn
FROM t1
CROSS JOIN
XMLTABLE('/json/openings/row'
PASSING xml_data
COLUMNS
closed_at VARCHAR2(100) PATH 'closed_at',
close_reason VARCHAR2(900) PATH 'close_reason/name'
)
)
SELECT close_reason
FROM t2
WHERE rn = 1
为了带上最新的关闭原因。
如果你真的需要使用问题中给出的那些功能,那么使用下面的代码块
DECLARE
v_json VARCHAR2(32767);
v_ct OWA.VC_ARR;
v_cr OWA.VC_ARR;
TYPE ts IS TABLE OF TIMESTAMP INDEX BY BINARY_INTEGER;
v_ts ts;
v_ts1 TIMESTAMP;
idx INT;
BEGIN
SELECT *
INTO v_json
FROM t0; -- there's no WHERE clause assuming only one row is to be inserted
APEX_JSON.PARSE(v_json);
FOR i IN 1..APEX_JSON.GET_COUNT('openings')
LOOP
v_ct(i) := APEX_JSON.GET_VARCHAR2('openings['||i||'].closed_at');
v_ts(i) := TO_TIMESTAMP(v_ct(i), 'yyyy-mm-dd"T"hh24:mi:ss.ff"Z"');
IF NVL(v_ts1, v_ts(i)) <= v_ts(i) THEN
v_ts1 := v_ts(i);
idx := i;
END IF;
v_cr(i) := APEX_JSON.GET_VARCHAR2('openings['||i||'].close_reason.name');
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_cr(idx));
END;
/
我在 JSON
下面使用 Oracle 11gR2 数据库中的 APEX_JSON
进行解析。
我的要求是按 closed_at
对日期进行排序并选择最新的 close_reason。我正在考虑将 closed_at
和 close_reason
填充到 APEX 集合中。将日期按 apex_collections 降序排序以选择最新的 close_reason
.
你能帮忙写下 APEX_JSON.get_count
和 APEX_JSON.get_varchar2
来获取 closed_at
和 close_reason
.
{"openings": [{
"id": 5003,
"opening_id": null,
"status": "closed",
"opened_at": "2020-11-30T20:09:56.487Z",
"closed_at": "2020-12-02T22:43:45.736Z",
"application_id": 76370003,
"close_reason": null
}, {
"id": 8003,
"opening_id": null,
"status": "closed",
"opened_at": "2020-11-30T20:59:02.267Z",
"closed_at": "2020-12-04T11:07:26.087Z",
"application_id": 45990003,
"close_reason": {
"id": 7003,
"name": "Hire - New Headcount"
}
}
]
}
谢谢 基肖尔
在使用APEX_JSON.GET_VARCHAR2()
之前,需要在PL/SQL代码中解析APEX_JSON.PARSE()
。而不是使用 PL/SQL,SQL 可能会通过使用 XMLTABLE
直接使用,例如
WITH t1 AS
(
SELECT APEX_JSON.TO_XMLTYPE(jsdata) AS xml_data
FROM t0 -- suppose your json data is inserted into jsdata column of this table
), t2 AS
(
SELECT close_reason,
ROW_NUMBER() OVER
(ORDER BY TO_TIMESTAMP(closed_at, 'yyyy-mm-dd"T"hh24:mi:ss.ff"Z"') DESC) AS rn
FROM t1
CROSS JOIN
XMLTABLE('/json/openings/row'
PASSING xml_data
COLUMNS
closed_at VARCHAR2(100) PATH 'closed_at',
close_reason VARCHAR2(900) PATH 'close_reason/name'
)
)
SELECT close_reason
FROM t2
WHERE rn = 1
为了带上最新的关闭原因。
如果你真的需要使用问题中给出的那些功能,那么使用下面的代码块
DECLARE
v_json VARCHAR2(32767);
v_ct OWA.VC_ARR;
v_cr OWA.VC_ARR;
TYPE ts IS TABLE OF TIMESTAMP INDEX BY BINARY_INTEGER;
v_ts ts;
v_ts1 TIMESTAMP;
idx INT;
BEGIN
SELECT *
INTO v_json
FROM t0; -- there's no WHERE clause assuming only one row is to be inserted
APEX_JSON.PARSE(v_json);
FOR i IN 1..APEX_JSON.GET_COUNT('openings')
LOOP
v_ct(i) := APEX_JSON.GET_VARCHAR2('openings['||i||'].closed_at');
v_ts(i) := TO_TIMESTAMP(v_ct(i), 'yyyy-mm-dd"T"hh24:mi:ss.ff"Z"');
IF NVL(v_ts1, v_ts(i)) <= v_ts(i) THEN
v_ts1 := v_ts(i);
idx := i;
END IF;
v_cr(i) := APEX_JSON.GET_VARCHAR2('openings['||i||'].close_reason.name');
END LOOP;
DBMS_OUTPUT.PUT_LINE(v_cr(idx));
END;
/