【问题标题】:Request large JSON in ORACLE UTL.HTTP在 ORACLE UTL.HTTP 中请求大型 JSON
【发布时间】:2019-12-18 18:07:35
【问题描述】:

我有一个使用 Rest web 服务的简单脚本,它工作正常,但是当答案超过 2000 个字符时,选择响应被剪切并且信息丢失,所以我需要一种方法来保留所有要插入的数据稍后将它们放入表格中。

这是我的脚本

WITH JSON AS
(
SELECT UTL_HTTP.REQUEST('http://jsonplaceholder.typicode.com/comments?postId=1') DOC FROM DUAL
)
SELECT
  POSTID,
  ID,
  NAME,
  EMAIL,
  BODY
  FROM JSON_TABLE
  (
    (SELECT DOC FROM JSON),
    '$[*]' COLUMNS
           (
           POSTID PATH '$.postId',
           ID PATH '$.id',
           NAME PATH '$.name',
           EMAIL PATH '$.email',
           BODY PATH '$.body'
           )
  )

使用此 URL 可以正常工作:'http://jsonplaceholder.typicode.com/comments?postId=1'(少于 2000 个字符)

用这个大一点,问题就出现了:'http://jsonplaceholder.typicode.com/comments'(超过2000个字符)

TY

【问题讨论】:

  • 查询大型 JSON 有效负载时存在记录限制。您使用的是什么版本的 Oracle?你有安装 APEX 吗?
  • UTL_HTTP.REQUEST only returns 2000 characters。您需要将响应加载到 clob 中以在查询中使用它;您可以编写自己的函数,如果安装了 APEX,也可以使用 APEX_WEB_SERVICE.MAKE_REQUEST
  • Oracle 12c,我没有使用 APEX,因为我想让它尽可能简单。
  • 您的另一个选择是使用 Java。这是我尝试处理非常大的 JSON 数据时的解决方案。

标签: json oracle rest web-services


【解决方案1】:

您需要遍历响应并将片段添加到 CLOB,就像这样。

  --
  -- Make the HTTP request
  --
  v_url := 'http://jsonplaceholder.typicode.com/comments?postId=1';
  dbms_output.put_line('URL sent: '||v_url);
  req := utl_http.begin_request(url => v_url);
  utl_http.set_header(r => req, name => 'User-Agent', value => 'Mozilla/4.0');

  --
  -- Loop through the response pieces
  --
  resp := utl_http.get_response(req);
  while not(eob)
  loop
     Begin
        utl_http.read_text(resp, string, 32766);
        --dbms_output.put_line(string);
        --
        -- Add the response pieces to a clob
        --
        data_clob := data_clob || string;
     Exception
        when utl_http.end_of_body then
           eob := true;
     End;
  end loop;
  utl_http.end_response(resp);

  --
  -- Convert to JSON
  --
  json_obj := json(data_clob);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2022-01-21
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多