ORACLE - JSON 到键值对 Table
ORACLE - JSON To Key Value Pair Table
有什么方法可以从 CLOB Json 列中获得 table 和 key/value 对?
这里的想法是以动态方式获取这些值。因为 CLOB 列并不总是包含相同的结构。
我已经创建了一个执行此操作的函数,但是由于它按字面意思解析 json 字符串,因此当我们在包含许多记录的 table 中使用它时,它的速度非常慢。我说的非常慢是指每秒 2-5 条记录,我知道这很糟糕。
Oracle 工具 (v.12c) 不提供动态获取 json tags/values 的方式,我们必须始终指定路径。
我一直在四处挖掘,但没有任何运气。有什么想法吗?
12.2 包含一组 PL/SQL 对象,可用于构建 DOM 类结构的 JSON 文档。然后,您可以使用对象上的方法提取键列表等。在 12.2 文档中查找可以像这样使用的 JSON_OBJECT_T、JSON_ARRAY_T 等..
SQL> create or replace type NV_PAIR_T as object (
2 NAME VARCHAR2(32),
3 VALUE VARCHAR2(32)
4 )
5 /
Type created.
SQL> create or replace type NV_PAIR_TABLE as TABLE of NV_PAIR_T
2 /
Type created.
SQL> create or replace function GET_KEY_VALUES(P_JSON_DOC VARCHAR2)
2 return NV_PAIR_TABLE PIPELINED
3 as
4 JO JSON_OBJECT_T := JSON_OBJECT_T(P_JSON_DOC);
5 JO_KEYS JSON_KEY_LIST := JO.get_keys();
6 begin
7
8 for i in 1..JO_KEYS.count loop
9 pipe row (NV_PAIR_T(JO_KEYS(i),JO.get_string(JO_KEYS(i))));
10 end loop;
11 end;
12 /
Function created.
SQL> select *
2 from TABLE(GET_KEY_VALUES('{"A":"AA", "B":"BB", "C":"CC"}'))
3 /
A AA
B BB
C CC
SQL>
这有帮助吗
这是一个将遍历嵌套结构的变体。
SQL> drop FUNCTION PROCESS_JSON_DOCUMENT
2 /
Function dropped.
SQL> drop TYPE NV_PAIR_TABLE
2 /
Type dropped.
SQL> drop TYPE NV_PAIR_T
2 /
Type dropped.
SQL> create or replace TYPE NV_PAIR_T as object (
2 JSON_PATH VARCHAR2(4000),
3 VALUE VARCHAR2(4000)
4 )
5 /
Type created.
SQL> create or replace TYPE NV_PAIR_TABLE
2 as TABLE of NV_PAIR_T
3 /
Type created.
SQL> create or replace FUNCTION PROCESS_JSON_DOCUMENT(P_JSON_PATH VARCHAR2, P_JSON_DOCUMENT VARCHAR2)
2 return NV_PAIR_TABLE PIPELINED
3 as
4 V_JSON_OBJECT JSON_OBJECT_T := JSON_OBJECT_T(P_JSON_DOCUMENT);
5 V_KEY_LIST JSON_KEY_LIST := V_JSON_OBJECT.get_keys();
6 V_KEY_NAME VARCHAR2(4000);
7 V_JSON_PATH VARCHAR2(4000);
8 V_CHILD_DOCUMENT VARCHAR2(4000);
9 begin
10 for i in 1..V_KEY_LIST.count loop
11 V_KEY_NAME := V_KEY_LIST(i);
12 if (V_JSON_OBJECT.get_type(V_KEY_LIST(i)) <> 'OBJECT') then
13 pipe row (NV_PAIR_T(P_JSON_PATH || '.' || V_KEY_NAME,V_JSON_OBJECT.get_string(V_KEY_NAME)));
14 else
15 V_JSON_PATH := P_JSON_PATH || '.' || V_KEY_NAME;
16 V_CHILD_DOCUMENT := V_JSON_OBJECT.get_object(V_KEY_NAME).to_string();
17 for j in (select * from TABLE(PROCESS_JSON_DOCUMENT(V_JSON_PATH, V_CHILD_DOCUMENT))) loop
18 pipe row (NV_PAIR_T(J.JSON_PATH,J.VALUE));
19 end loop;
20 end if;
21 end loop;
22 end;
23 /
Function created.
SQL> column JSON_PATH format A32
SQL> column VALUE format A32
SQL> select *
2 from TABLE(PROCESS_JSON_DOCUMENT('$','{"A":"AA", "B":"BB", "C":"CC", "X" : {"A":"AA", "B":"BB", "C":"CC"}}'))
3 /
$.A AA
$.B BB
$.C CC
$.X.A AA
$.X.B BB
$.X.C CC
6 rows selected.
SQL>
我有以下 json 无法解析上述功能。我要解析数据标签值
{
"data": [
{
"6": {
"value": "test1"
},
"7": {
"value": "test2"
},
"8": {
"value": ""
},
"9": {
"value": 1
},
"10": {
"value": "test5"
},
"11": {
"value": ""
}
},
{
"6": {
"value": "test2"
},
"7": {
"value": "test3"
},
"8": {
"value": ""
},
"9": {
"value": 2
},
"10": {
"value": "test5"
},
"11": {
"value": ""
}
},
{
"6": {
"value": "test1"
},
"7": {
"value": "test2"
},
"8": {
"value": ""
},
"9": {
"value": 1
},
"10": {
"value": "test5"
},
"11": {
"value": ""
}
},
{
"6": {
"value": "test2"
},
"7": {
"value": "test3"
},
"8": {
"value": ""
},
"9": {
"value": 2
},
"10": {
"value": "test5"
},
"11": {
"value": ""
}
}
],
"fields": [
{
"id": 9,
"label": "COL1",
"type": "numeric"
},
{
"id": 6,
"label": "COL2",
"type": "text"
},
{
"id": 7,
"label": "COL3",
"type": "text"
},
{
"id": 8,
"label": "COL4",
"type": "text"
},
{
"id": 10,
"label": "COL5",
"type": "text"
},
{
"id": 11,
"label": "COL_DATE6",
"type": "date"
}
],
"metadata": {
"numFields": 6,
"numRecords": 4,
"skip": 0,
"totalRecords": 4
}
}
有什么方法可以从 CLOB Json 列中获得 table 和 key/value 对?
这里的想法是以动态方式获取这些值。因为 CLOB 列并不总是包含相同的结构。
我已经创建了一个执行此操作的函数,但是由于它按字面意思解析 json 字符串,因此当我们在包含许多记录的 table 中使用它时,它的速度非常慢。我说的非常慢是指每秒 2-5 条记录,我知道这很糟糕。
Oracle 工具 (v.12c) 不提供动态获取 json tags/values 的方式,我们必须始终指定路径。
我一直在四处挖掘,但没有任何运气。有什么想法吗?
12.2 包含一组 PL/SQL 对象,可用于构建 DOM 类结构的 JSON 文档。然后,您可以使用对象上的方法提取键列表等。在 12.2 文档中查找可以像这样使用的 JSON_OBJECT_T、JSON_ARRAY_T 等..
SQL> create or replace type NV_PAIR_T as object (
2 NAME VARCHAR2(32),
3 VALUE VARCHAR2(32)
4 )
5 /
Type created.
SQL> create or replace type NV_PAIR_TABLE as TABLE of NV_PAIR_T
2 /
Type created.
SQL> create or replace function GET_KEY_VALUES(P_JSON_DOC VARCHAR2)
2 return NV_PAIR_TABLE PIPELINED
3 as
4 JO JSON_OBJECT_T := JSON_OBJECT_T(P_JSON_DOC);
5 JO_KEYS JSON_KEY_LIST := JO.get_keys();
6 begin
7
8 for i in 1..JO_KEYS.count loop
9 pipe row (NV_PAIR_T(JO_KEYS(i),JO.get_string(JO_KEYS(i))));
10 end loop;
11 end;
12 /
Function created.
SQL> select *
2 from TABLE(GET_KEY_VALUES('{"A":"AA", "B":"BB", "C":"CC"}'))
3 /
A AA
B BB
C CC
SQL>
这有帮助吗
这是一个将遍历嵌套结构的变体。
SQL> drop FUNCTION PROCESS_JSON_DOCUMENT
2 /
Function dropped.
SQL> drop TYPE NV_PAIR_TABLE
2 /
Type dropped.
SQL> drop TYPE NV_PAIR_T
2 /
Type dropped.
SQL> create or replace TYPE NV_PAIR_T as object (
2 JSON_PATH VARCHAR2(4000),
3 VALUE VARCHAR2(4000)
4 )
5 /
Type created.
SQL> create or replace TYPE NV_PAIR_TABLE
2 as TABLE of NV_PAIR_T
3 /
Type created.
SQL> create or replace FUNCTION PROCESS_JSON_DOCUMENT(P_JSON_PATH VARCHAR2, P_JSON_DOCUMENT VARCHAR2)
2 return NV_PAIR_TABLE PIPELINED
3 as
4 V_JSON_OBJECT JSON_OBJECT_T := JSON_OBJECT_T(P_JSON_DOCUMENT);
5 V_KEY_LIST JSON_KEY_LIST := V_JSON_OBJECT.get_keys();
6 V_KEY_NAME VARCHAR2(4000);
7 V_JSON_PATH VARCHAR2(4000);
8 V_CHILD_DOCUMENT VARCHAR2(4000);
9 begin
10 for i in 1..V_KEY_LIST.count loop
11 V_KEY_NAME := V_KEY_LIST(i);
12 if (V_JSON_OBJECT.get_type(V_KEY_LIST(i)) <> 'OBJECT') then
13 pipe row (NV_PAIR_T(P_JSON_PATH || '.' || V_KEY_NAME,V_JSON_OBJECT.get_string(V_KEY_NAME)));
14 else
15 V_JSON_PATH := P_JSON_PATH || '.' || V_KEY_NAME;
16 V_CHILD_DOCUMENT := V_JSON_OBJECT.get_object(V_KEY_NAME).to_string();
17 for j in (select * from TABLE(PROCESS_JSON_DOCUMENT(V_JSON_PATH, V_CHILD_DOCUMENT))) loop
18 pipe row (NV_PAIR_T(J.JSON_PATH,J.VALUE));
19 end loop;
20 end if;
21 end loop;
22 end;
23 /
Function created.
SQL> column JSON_PATH format A32
SQL> column VALUE format A32
SQL> select *
2 from TABLE(PROCESS_JSON_DOCUMENT('$','{"A":"AA", "B":"BB", "C":"CC", "X" : {"A":"AA", "B":"BB", "C":"CC"}}'))
3 /
$.A AA
$.B BB
$.C CC
$.X.A AA
$.X.B BB
$.X.C CC
6 rows selected.
SQL>
我有以下 json 无法解析上述功能。我要解析数据标签值
{
"data": [
{
"6": {
"value": "test1"
},
"7": {
"value": "test2"
},
"8": {
"value": ""
},
"9": {
"value": 1
},
"10": {
"value": "test5"
},
"11": {
"value": ""
}
},
{
"6": {
"value": "test2"
},
"7": {
"value": "test3"
},
"8": {
"value": ""
},
"9": {
"value": 2
},
"10": {
"value": "test5"
},
"11": {
"value": ""
}
},
{
"6": {
"value": "test1"
},
"7": {
"value": "test2"
},
"8": {
"value": ""
},
"9": {
"value": 1
},
"10": {
"value": "test5"
},
"11": {
"value": ""
}
},
{
"6": {
"value": "test2"
},
"7": {
"value": "test3"
},
"8": {
"value": ""
},
"9": {
"value": 2
},
"10": {
"value": "test5"
},
"11": {
"value": ""
}
}
],
"fields": [
{
"id": 9,
"label": "COL1",
"type": "numeric"
},
{
"id": 6,
"label": "COL2",
"type": "text"
},
{
"id": 7,
"label": "COL3",
"type": "text"
},
{
"id": 8,
"label": "COL4",
"type": "text"
},
{
"id": 10,
"label": "COL5",
"type": "text"
},
{
"id": 11,
"label": "COL_DATE6",
"type": "date"
}
],
"metadata": {
"numFields": 6,
"numRecords": 4,
"skip": 0,
"totalRecords": 4
}
}