• oracle 11g plsql解析json数据示例1


    以下存储过程将数据库表中的clob类型字段(存储的内容为对应Json格式数据)读取出来,对其解析,进行相关业务操作

    CREATE OR REPLACE PROCEDURE xq_midso_gen(p_id IN NUMBER) AS
        ----------------------------------------------------------
        --author:xy
        --date:20180627
        --description:
        /*
        FOR (查询实际表[订单接口  XQ_MIDSO]中的[是否生成订单]为Y的记录) LOOP
          根据接口信息的json信息生成未提交的发货订单。
          生成发货订单头表:
          单据日期取SYSDATE。
          订单类型取新货订单。
          发货店仓取总部店仓。
          收货店仓取接口中的customer_name对应的经销商下的任一店仓(根据名称匹配)。
          鲜桥订单编码取接口中的ordercode。
          备注:由鲜桥接口自动生成!
          调用存储过程:B_SO_AC。
          生成发货订单明细:
              条码、款号、ASI取接口中的product_name对应条码的值。
              数量取接口中的amount。
          调用存储过程:B_SOITEM_ACM。
          调用存储过程:B_SO_AM。
        END LOOP;
        */
    
        /*
        
        */
        ----------------------------------------------------------
    
        v_injson json; --用于将接口信息转换为json格式
    
        v_b_so_id    b_so.id%TYPE; --要使用的发货订单ID
        v_b_so_docno b_so.docno%TYPE; --发货订单据编号
        v_table_id   ad_table.id%TYPE; --发货订单m_agtpur表的id
        v_ordercode  b_so.xq_ordercode%TYPE; --发货订单鲜桥订单编码
    
        v_c_store_id c_store.id%TYPE; --总部店仓ID
    
        v_customer_name c_customer.name%TYPE; --订单头信息中的经销商名称
        v_cc_store_id   c_store.id%TYPE; --经销商下任一id
    
        v_delivery_time    VARCHAR2(20); --配送时间(发货日期)
        v_delivery_time1   NUMBER(8); --配送时间(发货日期)
        v_delivery_address b_so.dest_address%TYPE; --收货地址
        v_amount           b_soitem.qty%TYPE; --数量
    
        v_bodylist            json_list; --订单明细信息列表
        v_onejson             json; --用于解析每一个明细数据
        v_m_product_id        m_product.id%TYPE; --款号
        v_m_productalias_name m_product_alias.no%TYPE; --条码名
        v_m_productalias_id   m_product_alias.id%TYPE; --条码id
    
        v_asi         b_soitem.m_attributesetinstance_id%TYPE; --asi
        v_b_soitem_id b_soitem.id%TYPE; --发货订单明细id
    
        v_code    NUMBER(3);
        v_message VARCHAR2(500);
    
        v_clob_varchar2 VARCHAR2(4000);
    
    BEGIN
        --查询实际表[订单接口  XQ_MIDSO]中的[是否生成订单]为Y的记录
        FOR v_list IN (SELECT xms.id, xms.ad_client_id, xms.ad_org_id,
                              xms.creationdate, xms.ownerid, xms.errormeg
                       FROM xq_midso xms
                       WHERE xms.is_so = 'Y') LOOP
            BEGIN
            
                --获取接口信息
                SELECT dbms_lob.substr(xms.param)
                INTO v_clob_varchar2
                FROM xq_midso xms
                WHERE xms.id = v_list.id;
            
                v_injson := json(v_clob_varchar2);
            
                --获取headerlist:orderHeader
                --v_id := json_ext.get_string(v_injson, 'CallInfo.orderHeader.id');
                v_ordercode := json_ext.get_string(v_injson,
                                                   'CallInfo.orderHeader.ordercode');
                v_customer_name := json_ext.get_string(v_injson,
                                                       'CallInfo.orderHeader.customer_name');
                v_delivery_time := substr(json_ext.get_string(v_injson,
                                                              'CallInfo.orderHeader.delivery_time'),
                                          1, 10);
                v_delivery_time1 := to_number(REPLACE(v_delivery_time, '-', ''));
                v_delivery_address := json_ext.get_string(v_injson,
                                                          'CallInfo.orderHeader.delivery_address');
            
                --获取表b_so的id
                SELECT id
                INTO v_table_id
                FROM ad_table
                WHERE NAME = upper('b_so');
            
                --自动生成单据编号
                SELECT t.sequencename
                INTO v_b_so_docno
                FROM ad_column t
                WHERE t.ad_table_id = v_table_id
                AND t.dbname = 'DOCNO';
            
                v_b_so_docno := get_sequenceno(v_b_so_docno, v_list.ad_client_id);
            
                --获取要使用的发货订单id
                v_b_so_id := get_sequences('B_SO');
            
                --获取总部店仓ID
                SELECT cs.id
                INTO v_c_store_id
                FROM c_store cs
                WHERE cs.name = '总部仓库'
                AND cs.ad_client_id = v_list.ad_client_id;
            
                BEGIN
                    --获取对应经销商下任一店仓ID:v_cc_store_id
                    SELECT nvl(cs.id, 0)
                    INTO v_cc_store_id
                    FROM c_store cs
                    JOIN c_customer ccu
                    ON (cs.c_customer_id = ccu.id AND ccu.name = v_customer_name)
                    WHERE rownum <= 1;
                EXCEPTION
                    WHEN no_data_found THEN
                        v_cc_store_id := NULL;
                END;
                /*
                生成发货订单头表:
                单据日期取SYSDATE。
                订单类型取新货订单。
                发货店仓取总部店仓。
                收货店仓取接口中的customer_name对应的经销商下的任一店仓(根据名称匹配)。
                鲜桥订单编码取接口中的ordercode。
                备注:由鲜桥接口自动生成!
                 调用存储过程:B_SO_AC。
                */
                --dbms_output.put_line('xuyang123:v_b_so_docno:' || v_b_so_docno);
                BEGIN
                    INSERT INTO b_so
                        (id, billdate, docno, doctype, c_store_id, c_dest_id,
                         xq_ordercode, predateout, dest_address, description,
                         ad_client_id, ad_org_id, ownerid, creationdate, status,
                         isactive)
                    VALUES
                        (v_b_so_id, to_number(to_char(SYSDATE, 'yyyymmdd')),
                         v_b_so_docno, 'FWD', v_c_store_id, v_cc_store_id,
                         v_ordercode, v_delivery_time1, v_delivery_address,
                         '由鲜桥接口自动生成!', v_list.ad_client_id, v_list.ad_org_id,
                         v_list.ownerid, SYSDATE, 1, 'Y');
                EXCEPTION
                    WHEN OTHERS THEN
                        dbms_output.put_line('(debug)订单接口记录id:' || v_list.id ||
                                             ',生成发货订单发生异常:' || SQLERRM);
                        CONTINUE;
                END;
            
                --调用存储过程:B_SO_AC。
                BEGIN
                    b_so_ac(v_b_so_id);
                EXCEPTION
                    WHEN OTHERS THEN
                        dbms_output.put_line('发货订单记录id:' || v_b_so_id ||
                                             ',调用发货订单ac程序b_so_ac发生异常:' || SQLERRM);
                END;
                /*获取明细数据,插入到发货订单明细表*/
                /*
                  生成发货订单明细:
                  条码、款号、ASI取接口中的product_name对应条码的值。
                  数量取接口中的amount。
                  调用存储过程:B_SOITEM_ACM。
                  调用存储过程:B_SO_AM。
                */
                v_bodylist := json_list();
                v_onejson := json();
            
                --获取body:orderBody
                v_bodylist := json_ext.get_json_list(v_injson, 'CallInfo.orderBody');
            
                --循环获取明细数据,并插入数据库中
                FOR idx IN 1 .. v_bodylist.count LOOP
                    --读取每个明细信息
                    v_onejson := json(v_bodylist.get_elem(idx));
                    v_m_productalias_name := json_ext.get_string(v_onejson,
                                                                 'product_name');
                    v_amount := to_number(json_ext.get_string(v_onejson, 'amount'));
                
                    --获取品名对应的款号,条码,asi
                    BEGIN
                        SELECT mpa.id, mpa.m_product_id,
                               mpa.m_attributesetinstance_id
                        INTO v_m_productalias_id, v_m_product_id, v_asi
                        FROM m_product_alias mpa
                        WHERE mpa.no = v_m_productalias_name;
                    EXCEPTION
                        WHEN no_data_found THEN
                            dbms_output.put_line('条码:' || v_m_productalias_name ||
                                                 ',在条码档案中不存在!');
                            CONTINUE;
                    END;
                    --获取即将使用的发货订单明细记录id
                    v_b_soitem_id := get_sequences('bo_soitem');
                
                    --插入发货订单明细表
                    INSERT INTO b_soitem
                        (id, b_so_id, m_productalias_id, m_product_id,
                         m_attributesetinstance_id, qty)
                    VALUES
                        (v_b_soitem_id, v_b_so_id, v_m_productalias_id,
                         v_m_product_id, v_asi, v_amount);
                
                    --调用存储过程:B_SOITEM_ACM
                    BEGIN
                        b_soitem_acm(v_b_soitem_id);
                    EXCEPTION
                        WHEN OTHERS THEN
                            dbms_output.put_line('发货订单明细记录id:' || v_b_soitem_id ||
                                                 ',调用发货订单明细acm程序b_soitem_acm发生异常:' ||
                                                 SQLERRM);
                    END;
                
                    --调用存储过程:B_SO_AM
                    BEGIN
                        b_so_am(v_b_so_id, v_code, v_message);
                    EXCEPTION
                        WHEN OTHERS THEN
                            dbms_output.put_line('发货订单记录id:' || v_b_so_id ||
                                                 ',调用发货订单am程序B_SO_AM发生异常:' ||
                                                 SQLERRM);
                    END;
                
                END LOOP;
            
                --生成发货订单后,更新订单接口xq_midso当前记录is_so为‘N’
                UPDATE xq_midso xms
                SET xms.is_so = 'N'
                WHERE xms.id = v_list.id;
            
                COMMIT;
            
            EXCEPTION
                WHEN OTHERS THEN
                    dbms_output.put_line('订单接口记录id:' || v_list.id ||
                                         ',生成发货订单发生异常:' || SQLERRM);
            END;
        END LOOP;
    
    END;
    

      

  • 相关阅读:
    解决IE6不支持position:fixed的bug
    响应式Web设计基础
    多行文本溢出显示省略号(…)全攻略
    解读CSS布局之-水平垂直居
    理解CSS中BFC
    七个你可能不了解的CSS单位
    屏蔽系统热键钩子Hook程序
    Win 2008 r2 远程桌面多用户登陆,一用户多登陆配置
    把Excel转换成DataTable,Excel2003+
    DataGridView不显示未绑定的列-AutoGenerateColumns
  • 原文地址:https://www.cnblogs.com/Jeffrey-xu/p/9396315.html
Copyright © 2020-2023  润新知