Oracle 12 c JSON Обработка ошибок при анализе TABLE - PullRequest
0 голосов
/ 14 апреля 2020

Возможно ли обработать ошибку при синтаксическом анализе JSON с JSON_TABLE? Как, например, приведенный ниже запрос работает

SELECT *
FROM 
JSON_TABLE(
    '[{"productCode":"AD","serials":[{"id":"234242343","isPrimary":true}]},{"productCode":"BC","serials":[{"id":"23345345","isPrimary":true}]}]'
    , '$[*]'
    columns(
        productCode varchar2 PATH '$.productCode' NULL ON ERROR,
        serials varchar2 format JSON PATH '$.serials' NULL ON ERROR
    )
);

Вывод выше приведен ниже:

|PRODUCTCODE | SERIALS                              |
|---------------------------------------------------|
|AD          |[{"id":"234242343","isPrimary":true}] |
|BC          |[{"id":"23345345","isPrimary":true}]  |

Здесь в приведенном выше примере ввод JSON действителен, однако в моем В этом случае нет никакой гарантии, что он извлекается из другой таблицы журнала.

Я хочу, чтобы запрос игнорировался, если он встречается с недопустимым JSON.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Вы можете использовать условие is json, чтобы отфильтровать недействительные JSON:

create table t (
  what varchar2(20),
  c1   varchar2(500)
);

insert into t 
  values ( 'valid JSON', '[{"productCode":"AD","serials":[{"id":"234242343","isPrimary":true}]},{"productCode":"BC","serials":[{"id":"23345345","isPrimary":true}]}]' );
insert into t 
  values ( 'invalid JSON', '"productCode":"AD","serials":[{"id":"234242343","isPrimary":true}]},{"productCode":"BC","serials":[{"id":"23345345","isPrimary":true}]}]' );
commit;

select what from t
where  c1 is json;

WHAT         
valid JSON   

Но это не нужно: json_table уже игнорирует недействительные документы!

SELECT what, j.*
FROM   t, JSON_TABLE(
    c1, '$[*]'
    columns(
      productCode varchar2 PATH '$.productCode' NULL ON ERROR,
      serials varchar2 format JSON PATH '$.serials' NULL ON ERROR
    )
) j;

WHAT          PRODUCTCODE    SERIALS                                 
valid JSON    AD             [{"id":"234242343","isPrimary":true}]    
valid JSON    BC             [{"id":"23345345","isPrimary":true}]  

Вы можете принудительно вызвать ошибку JSON с помощью предложения on error:

SELECT what, j.*
FROM   t, JSON_TABLE(
    c1, '$[*]'
    error on error
    columns (
      productCode varchar2 PATH '$.productCode' NULL ON ERROR,
      serials varchar2 format JSON PATH '$.serials' NULL ON ERROR
    )
) j;

ORA-40441: JSON syntax error
0 голосов
/ 14 апреля 2020

Простой способ перенести ваши данные в новую таблицу с проверочным ограничением, чтобы проверить, соответствуют ли данные в исходной таблице формата JSON как пользователя Oracle 12c +.

Если формат равен false, строка не будет вставлена ​​в эту новую таблицу, например

CREATE TABLE tab_new (
  id      INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  jsdata  VARCHAR2(500),
  CONSTRAINT json_chk CHECK (jsdata IS JSON)
);

BEGIN
  FOR C IN ( SELECT jsdata FROM tab_old )
  LOOP
  BEGIN
     INSERT INTO tab_new(jsdata) VALUES(c.jsdata) ;
   EXCEPTION
     WHEN OTHERS THEN IF SQLCODE = -2290 THEN 
                       INSERT INTO tab_error(jsdata) VALUES(c.jsdata) ;
                      END IF;
  END;
  END LOOP;
  COMMIT;
END;
/

Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...