Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORACLE-JSON到键值对表_Json_Oracle_Function_Oracle12c_Keyvaluepair - Fatal编程技术网

ORACLE-JSON到键值对表

ORACLE-JSON到键值对表,json,oracle,function,oracle12c,keyvaluepair,Json,Oracle,Function,Oracle12c,Keyvaluepair,有没有办法从CLOB Json列获取具有键/值对的表 这里的想法是以动态的方式获取这些值。因为CLOB列并不总是包含相同的结构 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> c

有没有办法从CLOB Json列获取具有键/值对的表

这里的想法是以动态的方式获取这些值。因为CLOB列并不总是包含相同的结构

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字符串,当我们在一个有很多记录的表中使用它时,它的速度非常慢。我说的非常慢是指每秒2-5张唱片,我知道这很糟糕

Oracle tools v.12c不提供获取json标记/值的动态方式,我们始终需要指定路径


我一直在到处挖,一点运气都没有。有什么想法吗

12.2包含一组PL/SQL对象,可用于构建类似DOM的JSON文档结构。然后可以使用对象上的方法提取关键点列表等。在12.2文档中查找JSON\u OBJECT\u T、JSON\u ARRAY\u 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>

当你说CLOB列并不总是包含相同的结构时,你的意思是什么样的变化?@APC在最坏的情况下,我可以预期每行有不同的JSON结构。因为该列将由各种不同的源填充。请给我一个包含嵌套对象的对象的示例。我现在身边没有我的电脑。但如果这能奏效,我会很高兴的!