oracle 11g plsql解析json數據示例1

如下存儲過程將數據庫表中的clob類型字段(存儲的內容爲對應Json格式數據)讀取出來,對其解析,進行相關業務操做sql

 

 

 

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;
相關文章
相關標籤/搜索