PLSQL 导入 JSON 并导出为 JSON 文件

Posted

技术标签:

【中文标题】PLSQL 导入 JSON 并导出为 JSON 文件【英文标题】:PLSQL import JSON and export as a JSON file 【发布时间】:2019-10-14 19:23:28 【问题描述】:

我是 PL SQL 的新手。我已经用数据库应用程序开发虚拟机设置了一个虚拟盒子(我认为它里面有我需要的一切,但不确定) 现在我想将 json 文件加载为表格。 (然后做一些事情) 然后再次导出

这是 Json 文件:

    [

  "id" : 1,
  "created_at" : "Tue Oct 22 16:08:59 +0000 2013",
  "text" : "RT @Piratenpartei: Der @humanErr zur EU Datenschutzverordnung #EUDataP : “Starker EU-Datenschutz darf nicht scheitern” ",
  "lang" : "de",
  "place" : null,
  "retweet_count" : 10,
  "user" : 
    "created_at" : "Mon Jun 03 12:37:14 +0000 2013",
    "description" : "Der  Bezirksverband  Tübingen  im Landesverband Baden-Württemberg",
    "followers_count" : 122,
    "id" : 1479629599,
    "lang" : "de",
    "name" : "BzV Tübingen",
    "screen_name" : "BZV_Tuebingen",
    "url" : ""
  
, 
  "id" : 2,
  "created_at" : "Sat Oct 19 12:15:54 +0000 2013",
  "text" : "RT @PiratenBW: Unser nächster Landesparteitag findet am 15.02.-16.02 2014 in Heidelberg statt. /s3",
  "lang" : "de",
  "place" : null,
  "retweet_count" : 17,
  "user" : 
    "created_at" : "Mon Jun 03 12:37:14 +0000 2013",
    "description" : "Der  Bezirksverband  Tübingen  im Landesverband Baden-Württemberg",
    "followers_count" : 122,
    "id" : 1479629599,
    "lang" : "de",
    "name" : "BzV Tübingen",
    "screen_name" : "BZV_Tuebingen",
    "url" : ""
  

]

通过导出我的意思是这样的: http://www.thatjeffsmith.com/archive/2012/05/formatting-query-results-to-csv-in-oracle-sql-developer/

也许还有一些额外的问题。 有没有类似自动导入的东西。如果文件较大,不清楚里面到底是什么,或者文档很差。

也许我应该添加我设置的数据库软件。 我在这里有一个帐户; https://apex.oracle.com 我在 APP Development VM 的 Virtual Box 中安装了这个:https://www.oracle.com/downloads/developer-vm/community-downloads.html 但也许我需要别的东西。

我也在研究 Postgre,但这个问题是关于 Oracle 的。

【问题讨论】:

“加载”和“导出”对您来说究竟意味着什么?您想创建一个包含单个 JSON 列的表,加载一行数据,然后对该表运行一些查询并保存来自客户端应用程序(即 SQL Developer)的结果吗?您是否要获取此 JSON 文档并将其加载到多个关系表的多行中(即 user 表中的一行,tweet 表中的两行),然后编写查询来操作关系数据,然后重新构建一个不同的 JSON 文档?还有什么? 首先加载为表格。我想我需要建立一个干净的新数据库?对?也许有一些自动功能?然后将整个数据库导出为 json 文档。所以其他人可以使用它。 为一个 JSON 文档创建整个数据库似乎有点矫枉过正,当您谈论将整个数据库导出为 JSON 文档时,我不确定您的意思。您是否真的要包含整个数据库(表空间、权限、配置设置、表定义、数据等)?或者只是您发布的 JSON 文档中的一些数据。您是否尝试将文档加载到数据库中单个表的单行中? 有一种方法可以将整个 JSON 负载加载到 Oracle 表中的单个 JSON 验证列中,然后将 JSON 的元素提取到同一个或另一个表中的其他列中)。这就是你想要做的吗? 不幸的是我无法上传 json 文件。在德国我可以请求数据,一家公司超过了我。好吧,我已经从 REWE 那里索取了我的数据,它是一家当地的超市,我得到了一个 json 文件,......它是一个超过 5 年的文件。什么,何时,位置,价格,以及他们拥有的一切。是否有一种“自动”的方式将其加载到数据库中?在我看来,它是超级非结构化的。 【参考方案1】:

用于操作 json 的设置:

create table json_from_file (id number, data clob, constraint chk_data_is_json check (data is json));

insert into json_from_file (id, data)
  values ( 1, '
  "id" : 1,
  "created_at" : "Tue Oct 22 16:08:59 +0000 2013",
  "text" : "RT @Piratenpartei: Der @humanErr zur EU Datenschutzverordnung #EUDataP : “Starker EU-Datenschutz darf nicht scheitern” ",
  "lang" : "de",
  "place" : null,
  "retweet_count" : 10,
  "user" : 
    "created_at" : "Mon Jun 03 12:37:14 +0000 2013",
    "description" : "Der  Bezirksverband  Tübingen  im Landesverband Baden-Württemberg",
    "followers_count" : 122,
    "id" : 1479629599,
    "lang" : "de",
    "name" : "BzV Tübingen",
    "screen_name" : "BZV_Tuebingen",
    "url" : ""
  
');
insert into json_from_file (id, data)
  values ( 2, '

  "id" : 2,
  "created_at" : "Sat Oct 19 12:15:54 +0000 2013",
  "text" : "RT @PiratenBW: Unser nächster Landesparteitag findet am 15.02.-16.02 2014 in Heidelberg statt. /s3",
  "lang" : "de",
  "place" : null,
  "retweet_count" : 17,
  "user" : 
    "created_at" : "Mon Jun 03 12:37:14 +0000 2013",
    "description" : "Der  Bezirksverband  Tübingen  im Landesverband Baden-Württemberg",
    "followers_count" : 122,
    "id" : 1479629599,
    "lang" : "de",
    "name" : "BzV Tübingen",
    "screen_name" : "BZV_Tuebingen",
    "url" : ""
  
');

更改 id 为 2 的 json:

DECLARE
  cl_data       CLOB;
  t_root_object JSON_OBJECT_T;
  t_user_object JSON_OBJECT_T;

  CURSOR cu_get_data is
  select data
    from json_from_file
   where id = 2;
BEGIN

   OPEN cu_get_data;
  FETCH cu_get_data INTO cl_data;
  CLOSE cu_get_data;

  t_root_object := JSON_OBJECT_T(cl_data);
  t_root_object.put('lang','ES'); -- changes "lang" in root object

  t_user_object := t_root_object.get_object('user');
  t_user_object.put('lang','ENG'); -- changes "lang" in root object.user

   cl_data := t_root_object.to_string;

   UPDATE json_from_file -- saving change in database
      SET data = cl_data
    WHERE id = 2;

   COMMIT;
end;

将所有部分重新组合在一起以便稍后导出:

create table exported_data(data clob);
/
declare

cursor cu_parts is
select data 
  from json_from_file;

whole_json clob;
begin

  whole_json := '['||chr(10);
  for json_part in cu_parts loop
    whole_json := whole_json||json_part.data;
  end loop;
  whole_json := chr(10)||']';

  insert into exported_data(data) values (whole_json);
  commit;
end;

【讨论】:

不是在创建合理的数据库模型吧? 加载 json 文件后我会得到什么?它仍然是一列中的字符串? 不,这是创建包含两列的表。第一个包含 id,第二个包含部分 json【参考方案2】:

要创建关系数据库模型,您可以使用: select 会将数据从 json 转换为普通记录,然后 insert 将其放入 table。列 json_id 告诉我们它是从哪个 json 创建的。

-- creates table for root elements of json
create table root_elem (json_id number, id number,create_at varchar2(100), text varchar2(4000), lang varchar2(10), place varchar2(4000), retweet_count number);


    insert into root_elem(json_id, id, create_at, text, lang, place, retweet_count)
    select jff.id json_id, jt.id, jt.created_at, jt.text, jt.lang, jt.place, jt.retweet_count
    from json_from_file jff
    , json_table(jff.data, '$[*]'
    columns (id path '$.id',
             created_at path '$.created_at',
             text path '$.text',
             lang path '$.lang',
             place path '$.place',
             retweet_count path '$.retweet_count'
             )) jt 



-- create table for user elements (root.user)    
  create table users_elem (json_id number, id number,created_at varchar2(100), description varchar2(4000), followers_count number, lang varchar2(100), name varchar2(100), screen_name varchar2(100), url varchar2(4000));

insert into users_elem(json_id, id ,created_at, description, followers_count, lang, name, screen_name, url)
select jff.id json_id,ida ,created_at, description, followers_count, lang, name, screen_name, url
from json_from_file jff
, json_table(jff.data, '$.user[*]'
columns (ida path '$.id',
         created_at path '$.created_at',
         description path '$.description',
         followers_count path '$.followers_count',
         lang path '$.lang',
         name path '$.name',
         screen_name path '$.screen_name',
         url path '$.url'
         )) jt 

【讨论】:

以上是关于PLSQL 导入 JSON 并导出为 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-POI 导入导出EXCEL(含JSON)

导出 JSON 数据并加载到关系数据库中

将 pandas 数据框导出到 json 并返回到具有相同顺序的列的数据框

VUE中使用vue-json-excel超级方便导出excel表格数据

plsql导入数据

plsql导出csv数据是空白