如下存儲過程將數據庫表中的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;