ORACLE解析JSON数据示例(使用事务级临时表:批量写入数据库)

1:对于批量的json数据,这里使用事务级临时表,来暂存从json解析出各字段的值,最后再批量插入物理表中。

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

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

    v_starttime INTEGER; --开始时间
    v_endtime   INTEGER; --结束时间

BEGIN
    v_starttime := dbms_utility.get_time;
    --将接口信息转化为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 rp_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'));
    
        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 rp_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'));
        
        END LOOP;
    
    END LOOP;

    BEGIN
        INSERT INTO list_product
            SELECT *
            FROM rp_list_product;
    EXCEPTION
        WHEN OTHERS THEN
            p_message := p_message || SQLERRM;
    END;

    BEGIN
    
        INSERT INTO list_product_alias
            SELECT *
            FROM rp_list_product_alias;
    EXCEPTION
        WHEN OTHERS THEN
            p_message := p_message || SQLERRM;
    END;

    v_endtime := dbms_utility.get_time;

    p_message := p_message || '--inserting time:' ||
                 (v_endtime - v_starttime) / 100;

    p_code := 0;

END;

  

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