使用其他表中的键在Oracle中进行动态JSON解析

使用其他表中的键在Oracle中进行动态JSON解析,json,oracle,Json,Oracle,我需要帮助从存储在oracle表中的JSON列中提取数据。JSON数据列最多可以有10个键,并且can键数可以从1到10不等。我必须使用元数据表中存储的列名以关系表格式创建视图,并创建读取列数据的动态查询 CREATE TABLE json_species ( id NUMBER NOT NULL PRIMARY KEY, info CLOB CONSTRAINT is_json CHECK (info IS JSON ) ) / CREATE TABLE js

我需要帮助从存储在oracle表中的JSON列中提取数据。JSON数据列最多可以有10个键,并且can键数可以从1到10不等。我必须使用元数据表中存储的列名以关系表格式创建视图,并创建读取列数据的动态查询

    CREATE TABLE json_species
(
   id     NUMBER NOT NULL PRIMARY KEY,
   info   CLOB CONSTRAINT is_json CHECK (info IS JSON ) )
/
 CREATE TABLE json_species_props
(
   Props   varchar(100)
   )
BEGIN
   INSERT INTO json_species
        VALUES (1, '{"name":"Spider"}');
 
   INSERT INTO json_species
        VALUES (2, '{"name":"Elephant", "trunk_length":"10"}');
 
   INSERT INTO json_species
        VALUES (3, '{"name":"Shark", "fin_count":"4"}');
        
   Insert into json_species_props values ('name')
   Insert into json_species_props values ('trunk_length')
   Insert into json_species_props values ('fincount')   
 
   COMMIT;
END;
我需要以下关系格式的输出

Name        Trunk_length fincount
Spider      NULL         NULL
Elephant    10           NULL
Shark       NULL         4

由于我不熟悉JSON数据提取,请提供指导

假设您使用的是12.2或更高版本,最简单的方法是使用。有了它,您可以创建一个视图,为您进行JSON->relational转换。不需要单独的属性表

为此,首先创建一个JSON搜索索引:

create search index json_species_i 
  on json_species ( info )
  for json 
  parameters ( 'dataguide on' );
然后创建视图:

exec dbms_json.create_view_on_path ( 'species', 'json_species', 'info', '$' );

select * from species;

ID    INFO$name    INFO$fin_count    INFO$trunk_length   
    1 Spider       <null>            <null>               
    2 Elephant     <null>            10                   
    3 Shark        4                 <null>
如果愿意,还可以使用此选项将标量属性公开为虚拟列:

exec dbms_json.add_virtual_columns ( 'json_species', 'info' );

select * from json_species;

ID   INFO                                       NAME       INFO$fin_count   INFO$trunk_length   
   1 {"name":"Spider"}                          Spider     <null>           <null>               
   2 {"name":"Elephant", "trunk_length":"10"}   Elephant   <null>           10                   
   3 {"name":"Shark", "fin_count":"4"}          Shark      4                <null>               
exec dbms_json.add_virtual_列('json_species','info');
从json_物种中选择*;
ID信息名称信息$fin\u计数信息$trunk\u长度
1{“名称”:“蜘蛛”}蜘蛛
2{“名称”:“大象”,“躯干长度”:“10}大象10
3{“姓名”:“鲨鱼”,“鳍数”:“4}鲨鱼4

你能提供你想要的json输出吗?@RobertoHernandez抱歉,我已经更新了我的查询,很好的捕获;我错过了电话。谢谢@apcsthanker@ChrisSaxon,但是不是在所有现有的as数据上创建,而是可以从另一个表驱动它为什么?可以使用此方法从视图/表中选择所需的属性。当然,您可以自己滚动,但您必须使用动态SQL-如果使用
json\u value
或类似方法,则路径必须是文本文本。我的json列长度可变,对于某些列,它可以有3个键,而对于某些列,它可以有10个键。我想创建一个视图,其中有20列的列名(键)来自不同的元数据表。如果添加了new,我将只更新元数据表中的第11列,而不是10列,我将开始获得第11列,而其他9列保持为NULL,如果有人重命名,我将只添加第12列,如果有人插入具有新属性的JSON文档,我将显示prev和current value,您只需再次调用这些过程,数据库将根据需要重新创建视图/虚拟列
exec dbms_json.add_virtual_columns ( 'json_species', 'info' );

select * from json_species;

ID   INFO                                       NAME       INFO$fin_count   INFO$trunk_length   
   1 {"name":"Spider"}                          Spider     <null>           <null>               
   2 {"name":"Elephant", "trunk_length":"10"}   Elephant   <null>           10                   
   3 {"name":"Shark", "fin_count":"4"}          Shark      4                <null>