以下存储过程将数据库表中的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;