Oracle Чтение из json ответа - PullRequest
0 голосов
/ 26 мая 2020

У меня следующая проблема. Имея этот запрос:

select apex_web_service.make_rest_request(
     p_url => 'https://something.com/rest/Discount'
     ,p_http_method => 'GET'
     ,p_username => 'username'
     ,p_password => 'password'
    ) as custom
from dual;

Это возвращает это:

{"hasMore":false,"items":[{"id":12,"Origin":"ALL","Part":"PO423S","Channel":"RC"},{"id":13,"Origin":"ALL","Part":"LO123D","Channel":"RC"},{"id":14,"Origin":"ALL","Part":"SD765S","Channel":"AP"}]}

Я хочу создать группу каналов, чтобы узнать, сколько каналов мне нужно вставить в другую таблицу.

Я пробую это просто для перечисления:

select d.custom.items
from  (
    select apex_web_service.make_rest_request(
        p_url =>  'https://something.com/rest/Discount'
       ,p_http_method => 'GET'
       ,p_username => 'username'
       ,p_password => 'password'
    ) as custom
    from dual) d;

, но у меня такая ошибка:

ORA-22806: no es un objeto ni un elemento REF
22806. 00000 -  "not an object or REF"
*Cause:    An attempt was made to extract an attribute from an item that is
           neither an object nor a REF.
*Action:   Use an object type or REF type item and retry the operation.
Error en la línea: 12, columna: 8

Я также тестирую следующее:

create table temp_json (
  json_data blob not null
);
alter table temp_json
  add constraint temp_data_json 
  check ( json_data is json );

insert into temp_json
select apex_web_service.make_rest_request(
     p_url =>  'https://something.com/rest/Discount'
    ,p_http_method => 'GET'
    ,p_username => 'username'
    ,p_password => 'password
    ) as customDiscAplicability
from dual
;

select d.json_data.items
from   temp_json d;

Результат следующий:

ITEMS
-----
(null)

Я следую этому руководству: ССЫЛКА

Может ли кто-нибудь мне помочь?

С уважением

1 Ответ

0 голосов
/ 26 мая 2020

Когда вы выбираете apex_web_service.make_rest_request, возвращается строка. База данных не знает, что это JSON данные.

Если вы используете Oracle Database 18 c или выше, вы сможете обойти это, используя treat ... as json:

select d.custom.items.id from (
select treat ( '{
  "hasMore": false,
  "items": [  {
      "id": 12,
      "Origin": "ALL",
      "Part": "PO423S",
      "Channel": "RC"
    },  {
      "id": 13,
      "Origin": "ALL",
      "Part": "LO123D",
      "Channel": "RC"
    },  {
      "id": 14,
      "Origin": "ALL",
      "Part": "SD765S",
      "Channel": "AP"
    }
  ]
}' as json ) custom from dual
) d;

ITEMS        
[12,13,14] 

Чтобы понять, почему вставка ответа в таблицу, а затем его выбор, возвращает null, нам нужно увидеть точное JSON, которое там есть!

...