【问题标题】:Oracle 12c JSON TABLE parsing error handlingOracle 12c JSON TABLE 解析错误处理
【发布时间】:2020-04-14 11:38:42
【问题描述】:

是否可以在使用JSON_TABLE 解析无效 JSON 时处理错误? 例如下面的查询工作

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,我希望查询忽略。

【问题讨论】:

    标签: sql json oracle error-handling oracle12c


    【解决方案1】:

    简单的方法是将数据转移到带有检查约束的新表中,以检查源表中的数据是否符合JSON 格式作为Oracle 12c+ 用户。

    如果格式为假,则该行将不会插入到该新表中,例如

    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

    【讨论】:

      【解决方案2】:

      您可以使用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}]  
      

      您可以使用 on error 子句对无效 JSON 强制出错:

      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
      

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 2012-12-13
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 1970-01-01
        • 2023-02-22
        相关资源
        最近更新 更多