oracle 11g plsql解析json数据示例3(新)

对于如下格式的Json数据,用下面的存储过程进行解析(存储过程中json path,即关键字需与json数据大小写保持一致):

(注:'list'下是数组,包括多个款号,而每个款号下会有多个条码,所以对应条码的'LIST_PRODUCT_ALIAS'下为数组,包含多个条码信息)

1:Json数据

{
  "msg_no": "EA",
  "list": [{
    "ORIENTATION": "男款",
    "msg_no": "件",
    "LIST_PRODUCT_ALIAS": [{
      "SAP_ZZSTATUS": false,
      "RECKON_TYPE": "20服饰",
      "PROD_STATE": "A",
      "msg_no": "件",
      "table": "LIST_PRODUCT_ALIAS",
      "PROD_GRID": "3000225",
      "query_no": "2018080600000005",
      "SPEC": "00",
      "IS_SAP_MANAGE": true,
      "DESC_SPEC": "00",
      "DESC_COLOR": "银灰",
      "PROD_CLS_ID": "120901",
      "IS_SAMPLE": false,
      "COLOR": "30",
      "pK": "null"
    }, {
      "SAP_ZZSTATUS": false,
      "RECKON_TYPE": "20服饰",
      "PROD_STATE": "A",
      "msg_no": "件",
      "table": "LIST_PRODUCT_ALIAS",
      "PROD_GRID": "3000225",
      "query_no": "2018080600000005",
      "SPEC": "00",
      "IS_SAP_MANAGE": true,
      "DESC_SPEC": "00",
      "DESC_COLOR": "银灰",
      "PROD_CLS_ID": "120901",
      "IS_SAMPLE": false,
      "COLOR": "30",
      "pK": "null"
    }],
    "query_no": "2018080600000005",
    "PROD_ID": "120901",
    "PROD_YEAR": "2018",
    "BASIC_UOM": "件",
    "pK": "120901",
    "PROD_SEASON": "夏",
    "STATUS1": "A",
    "NAME": "120901测试",
    "ON_SALE_DATE": 1512748800000,--时间戳
    "ISSPESUPPLY": "2",
    "BRAND_ID": "MB",
    "table": "LIST_PRODUCT",
    "MODEL": "J903",
    "PLAN_BATCH": "3",
    "ISAGT": "2",
    "ON_BRAND_PRC": 29
  }]
  "query_no": "2018080600000005"
}

  

2:存储过程:

CREATE OR REPLACE PROCEDURE list_productalias_read(p_json    IN CLOB,
                                                   p_code    OUT NUMBER,
                                                   p_message OUT VARCHAR2) AS
    ----------------------------------------------------------
    --author:xuyang
    --date:20180809
    --description:获取接口信息,解析并传入商品目录中间表

    ----------------------------------------------------------
    v_injson    json;
    v_bodylist  json_list; --款号json列表
    v_bodylist1 json_list; --条码json列表
    v_onejson   json; --用于解析每一个款号数据
    v_onejson1  json; --用于解析每一个条码数据

BEGIN
    --将接口信息转化为json格式
    v_injson := json(p_json);

    --获取款号和条码数据,插入到中间表list_product和list_product_alias表
    v_bodylist := json_list();
    v_onejson := json();

    v_bodylist1 := json_list();
    v_onejson1 := json();

    v_bodylist := json_ext.get_json_list(v_injson, 'list');

    --循环获取款号数据,并插入中间表中
    FOR idx IN 1 .. v_bodylist.count LOOP
        v_onejson := json(v_bodylist.get_elem(idx));
    
        INSERT INTO list_product
            (id, ad_client_id, ad_org_id, create_date, writedate, ediflag,
             ownerid, modifierid, creationdate, modifieddate, isactive, prod_id,
             NAME, basic_uom, model, orientation, on_brand_prc, precost, status1,
             in_ctrl, kind, old_brand_id, puc_mode, isagt, isspesupply, remark,
             prod_year, prod_season, for_season, prod_theme, plan_batch,
             on_sale_date, series, themedesign, describemodule, sceneslife,
             brand_id, describesys, prod_line, prod_partm, prod_group,
             prod_sub_group, prod_sorts)
        VALUES
            (get_sequences('LIST_PRODUCT'), 37, 27, SYSDATE, SYSDATE, 80, 893,
             893, SYSDATE, SYSDATE, 'Y',
             json_ext.get_string(v_onejson, 'PROD_ID'),
             json_ext.get_string(v_onejson, 'NAME'),
             json_ext.get_string(v_onejson, 'BASIC_UOM'),
             json_ext.get_string(v_onejson, 'MODEL'),
             json_ext.get_string(v_onejson, 'ORIENTATION'),
             json_ext.get_number(v_onejson, 'ON_BRAND_PRC'),
             json_ext.get_number(v_onejson, 'PRECOST'),
             json_ext.get_string(v_onejson, 'STATUS1'),
             json_ext.get_string(v_onejson, 'IN_CTRL'),
             json_ext.get_string(v_onejson, 'KIND'),
             json_ext.get_string(v_onejson, 'OLD_BRAND_ID'),
             json_ext.get_string(v_onejson, 'PUC_MODE'),
             json_ext.get_string(v_onejson, 'ISAGT'),
             json_ext.get_string(v_onejson, 'ISSPESUPPLY'),
             json_ext.get_string(v_onejson, 'REMARK'),
             json_ext.get_string(v_onejson, 'PROD_YEAR'),
             json_ext.get_string(v_onejson, 'PROD_SEASON'),
             json_ext.get_string(v_onejson, 'FOR_SEASON'),
             json_ext.get_string(v_onejson, 'PROD_THEME'),
             json_ext.get_string(v_onejson, 'PLAN_BATCH'),
             substr(to_char(json_ext.get_number(v_onejson, 'ON_SALE_DATE') /
                             (1000 * 60 * 60 * 24) +
                             to_date('1970-01-01 08:00:00', 'YYYY/MM/DD HH:MI:SS'),
                             'YYYYMMDD HH24:MI:SS'), 1, 8),
             json_ext.get_string(v_onejson, 'SERIES'),
             json_ext.get_string(v_onejson, 'THEMEDESIGN'),
             json_ext.get_string(v_onejson, 'DESCRIBEMODULE'),
             json_ext.get_string(v_onejson, 'SCENESLIFE'),
             json_ext.get_string(v_onejson, 'BRAND_ID'),
             json_ext.get_string(v_onejson, 'DESCRIBESYS'),
             json_ext.get_string(v_onejson, 'PROD_LINE'),
             json_ext.get_string(v_onejson, 'PROD_PARTM'),
             json_ext.get_string(v_onejson, 'PROD_GROUP'),
             json_ext.get_string(v_onejson, 'PROD_SUB_GROUP'),
             json_ext.get_string(v_onejson, 'PROD_SORTS'));
    
        IF SQL%ROWCOUNT = 0 THEN
            p_message := p_message || 'product_code' ||
                         json_ext.get_string(v_onejson, 'prod_id') ||
                         'failed!!';
            CONTINUE;
        END IF;
    
        v_bodylist1 := json_ext.get_json_list(v_onejson, 'LIST_PRODUCT_ALIAS');
    
        FOR idx1 IN 1 .. v_bodylist1.count LOOP
            --读取每个条码信息,并插入中间表
            v_onejson1 := json(v_bodylist1.get_elem(idx1));
        
            INSERT INTO list_product_alias
                (id, ad_client_id, ad_org_id, create_date, writedate, ediflag,
                 ownerid, modifierid, creationdate, modifieddate, isactive,
                 prod_cls_id, color, desc_color, spec, desc_spec, prod_grid,
                 addit_desc, inner_bc, intnl_bc, reckon_type, is_sap_manage,
                 is_sample, sap_zzstatus, prod_state, prodnum)
            VALUES
                (get_sequences('LIST_PRODUCT_ALIAS'), 37, 27, SYSDATE, SYSDATE,
                 80, 893, 893, SYSDATE, SYSDATE, 'Y',
                 json_ext.get_string(v_onejson1, 'PROD_CLS_ID'),
                 json_ext.get_string(v_onejson1, 'COLOR'),
                 json_ext.get_string(v_onejson1, 'DESC_COLOR'),
                 json_ext.get_string(v_onejson1, 'SPEC'),
                 json_ext.get_string(v_onejson1, 'DESC_SPEC'),
                 json_ext.get_string(v_onejson1, 'PROD_GRID'),
                 json_ext.get_string(v_onejson1, 'ADDIT_DESC'),
                 json_ext.get_string(v_onejson1, 'INNER_BC'),
                 json_ext.get_string(v_onejson1, 'INTNL_BC'),
                 json_ext.get_string(v_onejson1, 'RECKON_TYPE'),
                 json_ext.get_string(v_onejson1, 'IS_SAP_MANAGE'),
                 json_ext.get_string(v_onejson1, 'IS_SAMPLE'),
                 json_ext.get_string(v_onejson1, 'SAP_ZZSTATUS'),
                 json_ext.get_string(v_onejson1, 'PROD_STATE'),
                 json_ext.get_string(v_onejson1, 'PRODNUM'));
        
            IF SQL%ROWCOUNT = 0 THEN
                p_message := p_message || 'product_alias_code:' ||
                             json_ext.get_string(v_onejson1, 'PROD_CLS_ID') ||
                             'failed!!';
            END IF;
        END LOOP;
    
    END LOOP;

    p_code := 0;

END;

  

原文地址:https://www.cnblogs.com/Jeffrey-xu/p/9448392.html