Lost !

-----hard working for the furture.

导航

统计

这个存储过程写的好!

复制代码
create or replace package body pkg_bba_rcv_pre is
  function lf_get_value(p_xml in xmltype, p_string in varchar2)
    return varchar2 is
  begin
    return p_xml.extract(p_string).getstringval();
  exception
    when others then
      return null;
  end;
  --收货预测处理类
  procedure pre_route(p_xml_param  in clob, --所有参数集合在xml中
                      p_out_cursor out sys_refcursor, --返回游标
                      p_out_number in out number, --返回数字型
                      p_out_string in out varchar2, --返回字符串
                      p_out_xml    out clob, --返回xml数据
                      p_status     out varchar2, --执行状态 OK/FAILE
                      p_message    out varchar2 --执行信息
                      ) is
  
    l_xml_param xmltype;
    l_function  varchar2(500);
    l_op_by     varchar2(100);
  
    p_pre_id               varchar2(255); -- 预测ID
    p_rcv_type             varchar2(255); -- 收货类型:(Local / Import)
    p_supplier_name        varchar2(255); -- 供应商名称
    p_po_number            varchar2(255); -- 订单号
    p_invoice              varchar2(255); -- 发票
    p_arrived_date         varchar2(255); -- 到达时间
    p_estimated_date       varchar2(255); -- 预计车辆达到时间
    p_item_process         varchar2(1000);
    p_boxes_qty            varchar2(255); -- 箱子数量
    p_trucks_qty           varchar2(255); -- 车辆数量
    p_state                varchar2(255); -- 状态
    p_remark               varchar2(255); -- 对外型号
    p_deliver_by           varchar2(255); -- 送货人
    p_deliver_date         varchar2(255); -- 送货时间
    p_estimated_date_begin varchar2(255); -- 时间
    p_estimated_date_end   varchar2(255); -- 时间
    p_asn_no               varchar2(255); -- ASN号
    p_asn_state            varchar2(255); -- ASN状态
    p_reg_flag             varchar2(255);
    v_sql                  varchar2(2000);
    v_condition            varchar2(2000);
  
  begin
    p_status     := 'FAIL';
    p_message    := 'Unknown error!';
    p_out_number := -1;
    p_out_string := 'X';
    p_out_xml    := 'X';
    open p_out_cursor for
      select null from dual where 1 = 0;
  
    l_xml_param := xmltype.createxml(p_xml_param);
    l_op_by     := lf_get_value(l_xml_param, '/ROOT/OP_BY/text()');
    l_function  := lf_get_value(l_xml_param, '/ROOT/FUNCTION/text()');
    case l_function
      when 'PRE_SELECT_INFO' then
        /*XML_PARAM 格式要求:
        <ROOT>
        <FUNCTION>PRE_SELECT_INFO</FUNCTION>
        <OP_BY>实际用户名</OP_BY>
        <PARAM>
        <P_PRE_ID>P_PRE_ID</P_PRE_ID>
        <P_INVOICE>P_INVOICE</P_INVOICE>
        <P_SUPPLIER_NAME>P_SUPPLIER_NAME</P_SUPPLIER_NAME>
        <P_RCV_TYPE>P_RCV_TYPE</P_RCV_TYPE>
        <P_ESTIMATED_DATE_BEGIN>P_ESTIMATED_DATE_BEGIN</P_ESTIMATED_DATE_BEGIN>
        <P_ESTIMATED_DATE_END>P_ESTIMATED_DATE_END</P_ESTIMATED_DATE_END>
        <p_ASN_NO>10000<p_ASN_NO>
        <p_ASN_STATE>1<p_ASN_STATE>
        <P_REG_FLAG>Y<P_REG_FLAG>
        </PARAM>
        </ROOT>
        */
        begin
          p_pre_id               := lf_get_value(l_xml_param,
                                                 '/ROOT/PARAM/P_PRE_ID/text()');
          p_invoice              := lf_get_value(l_xml_param,
                                                 '/ROOT/PARAM/P_INVOICE/text()');
          p_supplier_name        := lf_get_value(l_xml_param,
                                                 '/ROOT/PARAM/P_SUPPLIER_NAME/text()');
          p_rcv_type             := lf_get_value(l_xml_param,
                                                 '/ROOT/PARAM/P_RCV_TYPE/text()');
          p_po_number            := lf_get_value(l_xml_param,
                                                 '/ROOT/PARAM/P_PO_NUMBER/text()');
          p_estimated_date_begin := lf_get_value(l_xml_param,
                                                 '/ROOT/PARAM/P_ESTIMATED_DATE_BEGIN/text()');
          p_estimated_date_end   := lf_get_value(l_xml_param,
                                                 '/ROOT/PARAM/P_ESTIMATED_DATE_END/text()');
        
          p_asn_no    := lf_get_value(l_xml_param,
                                      '/ROOT/PARAM/P_ASN_NO/text()');
          p_asn_state := lf_get_value(l_xml_param,
                                      '/ROOT/PARAM/P_ASN_STATE/text()');
          p_reg_flag  := lf_get_value(l_xml_param,
                                      '/ROOT/PARAM/P_REG_FLAG/text()');
        
          v_sql := 'SELECT pre_id, rcv_type, supplier_name, po_number, invoice, estimated_date, boxes_qty,ITEM_PROCESS, trucks_qty, state, arrived_date, remark, create_by, create_date, last_update_by, last_update_date, deliver_by,asn_no,asn_state
,reg_flag,deliver_date FROM lmes_bba_rcv_reg_pre where 1=1 ';
          if p_pre_id is not null then
            v_condition := v_condition || ' and pre_id=' || p_pre_id;
          end if;
          if p_invoice is not null then
            v_condition := v_condition || ' and invoice=''' || p_invoice || '''';
          end if;
          if p_supplier_name is not null then
            v_condition := v_condition || ' and supplier_name like ''' ||
                           p_supplier_name || '''';
          end if;
        
          if p_rcv_type is not null then
            v_condition := v_condition || ' and rcv_type=''' || p_rcv_type || '''';
          end if;
          if p_po_number is not null then
            v_condition := v_condition || ' and po_number=''' ||
                           p_po_number || '''';
          end if;
          if p_estimated_date_begin is not null then
            v_condition := v_condition ||
                           ' and ESTIMATED_DATE >= to_date(''' ||
                           p_estimated_date_begin || ''',''mm/dd/yyyy'')';
          end if;
        
          if p_estimated_date_end is not null then
            v_condition := v_condition ||
                           ' and ESTIMATED_DATE <= to_date(''' ||
                           p_estimated_date_end || ''',''mm/dd/yyyy'') ';
          end if;
        
          if p_asn_no is not null then
            v_condition := v_condition || ' and asn_no=' || p_asn_no;
          end if;
        
          if p_asn_state is not null then
            v_condition := v_condition || ' and asn_state=' || p_asn_state;
          end if;
        
          if p_reg_flag is not null then
            v_condition := v_condition || ' and reg_flag=''' || p_reg_flag || '''';
          end if;
        
          v_sql := v_sql || v_condition;
        
          open p_out_cursor for v_sql;
        
          p_status  := 'OK';
          p_message := 'Success';
        exception
          when others then
            begin
              p_status  := 'FAIL';
              p_message := substr(sqlcode || sqlerrm, 1, 200);
            end;
        end;
      
    /*XML_PARAM 格式要求:
    <ROOT>
    <FUNCTION>PRE_INSERT_INFO</FUNCTION>
    <OP_BY>实际用户名</OP_BY>
    <PARAM>
    <P_RCV_TYPE>P_RCV_TYPE</P_RCV_TYPE>
    <P_SUPPLIER_NAME>P_SUPPLIER_NAME</P_SUPPLIER_NAME>
    <P_PO_NUMBER>P_PO_NUMBER</P_PO_NUMBER>
    <P_INVOICE>P_INVOICE</P_INVOICE>
    <P_ESTIMATED_DATE>P_ESTIMATED_DATE</P_ESTIMATED_DATE>
    <P_BOXES_QTY>P_BOXES_QTY</P_BOXES_QTY>
    <P_TRUCKS_QTY>P_TRUCKS_QTY</P_TRUCKS_QTY>
    <P_STATE>P_STATE</P_STATE>
    <P_REMARK>P_REMARK</P_REMARK>
    <P_DELIVER_BY>P_DELIVER_BY</P_DELIVER_BY>
    <P_DELIVER_DATE>P_DELIVER_DATE</P_DELIVER_DATE>
    </PARAM>
    </ROOT>
    */
      when 'PRE_INSERT_INFO' then
      
        begin
        
          p_rcv_type       := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_RCV_TYPE/text()');
          p_supplier_name  := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_SUPPLIER_NAME/text()');
          p_po_number      := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_PO_NUMBER/text()');
          p_invoice        := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_INVOICE/text()');
          p_estimated_date := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_ESTIMATED_DATE/text()');
          p_boxes_qty      := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_BOXES_QTY/text()');
          p_trucks_qty     := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_TRUCKS_QTY/text()');
          p_state          := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_STATE/text()');
          p_remark         := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_REMARK/text()');
          p_deliver_by     := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_DELIVER_BY/text()');
          p_deliver_date   := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_DELIVER_DATE/text()');
          p_item_process   := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_ITEM_PROCESS/text()');
          insert into lmes_bba_rcv_reg_pre
            (pre_id,
             rcv_type,
             supplier_name,
             po_number,
             invoice,
             estimated_date,
             boxes_qty,
             item_process,
             trucks_qty,
             state,
             arrived_date,
             remark,
             create_by,
             create_date,
             last_update_by,
             last_update_date,
             deliver_by,
             deliver_date)
          values
            (lmes_bba_rcv_reg_pre_s.nextval,
             p_rcv_type,
             p_supplier_name,
             p_po_number,
             p_invoice,
             to_date(p_estimated_date, 'mm/dd/yyyy hh24:mi:ss'),
             p_boxes_qty,
             p_item_process,
             p_trucks_qty,
             p_state,
             null,
             p_remark,
             l_op_by,
             sysdate,
             '',
             null,
             p_deliver_by,
             to_date(p_deliver_date, 'mm/dd/yyyy hh24:mi:ss'));
          commit; --提交
          p_status  := 'OK';
          p_message := 'Success';
        exception
          when others then
            begin
              rollback; --回滚
              p_status  := 'FAIL';
              p_message := substr(sqlcode || sqlerrm, 1, 200);
            end;
        end;
      when 'PRE_UPDATE_ARRIVED' then
        /* --XML_PARAM 格式要求:
        <ROOT>
        <FUNCTION>PRE_UPDATE_ARRIVED</FUNCTION>
        <OP_BY>实际用户名</OP_BY>
        <PARAM>
        <P_PRE_ID>P_PRE_ID</P_PRE_ID>
        <P_STATE>P_STATE</P_STATE>
        </PARAM>
        </ROOT>
        */
        begin
          p_pre_id := lf_get_value(l_xml_param,
                                   '/ROOT/PARAM/P_PRE_ID/text()');
          p_state  := lf_get_value(l_xml_param,
                                   '/ROOT/PARAM/P_STATE/text()');
          /*
          UPDATE LMES_BBA_RCV_REG_PRE
          SET STATE = P_STATE,
          ARRIVED_DATE = SYSDATE,
          LAST_UPDATE_BY = L_OP_BY,
          LAST_UPDATE_DATE = SYSDATE
          WHERE PRE_ID IN F_SPLIT(P_PRE_ID,',') ;*/
        
          if p_pre_id is null then
            p_status  := 'FAIL';
            p_message := 'PRE_ID can be not null';
            return;
          end if;
          v_sql := ' UPDATE LMES_BBA_RCV_REG_PRE SET STATE = ''' || p_state ||
                   ''', ARRIVED_DATE = SYSDATE, LAST_UPDATE_BY =''' ||
                   l_op_by ||
                   ''', LAST_UPDATE_DATE = SYSDATE WHERE NVL(state,'' '')<> ''ARRIVED'' and PRE_ID IN (' ||
                   p_pre_id || ')';
        
          execute immediate v_sql;
          commit; --提交
          p_status  := 'OK';
          p_message := 'Success';
        exception
          when others then
            begin
              rollback; --回滚
              p_status  := 'FAIL';
              p_message := substr(sqlcode || sqlerrm, 1, 200);
            end;
        end;
      
      when 'PRE_UPDATE_INFO' then
        /* --XML_PARAM 格式要求:
        <ROOT>
        <FUNCTION>PRE_UPDATE_INFO</FUNCTION>
        <OP_BY>实际用户名</OP_BY>
        <PARAM>
        <P_PRE_ID>P_PRE_ID</P_PRE_ID>
        <P_RCV_TYPE>P_RCV_TYPE</P_RCV_TYPE>
        <P_SUPPLIER_NAME>P_SUPPLIER_NAME</P_SUPPLIER_NAME>
        <P_PO_NUMBER>P_PO_NUMBER</P_PO_NUMBER>
        <P_INVOICE>P_INVOICE</P_INVOICE>
        <P_ESTIMATED_DATE>P_ESTIMATED_DATE</P_ESTIMATED_DATE>
        <P_BOXES_QTY>P_BOXES_QTY</P_BOXES_QTY>
        <P_TRUCKS_QTY>P_TRUCKS_QTY</P_TRUCKS_QTY>
        <P_ARRIVED_DATE>P_ARRIVED_DATE</P_ARRIVED_DATE>
        <P_STATE>P_STATE</P_STATE>
        <P_REMARK>P_REMARK</P_REMARK>
        </PARAM>
        </ROOT>
        */
        begin
          p_pre_id         := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_PRE_ID/text()');
          p_rcv_type       := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_RCV_TYPE/text()');
          p_supplier_name  := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_SUPPLIER_NAME/text()');
          p_po_number      := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_PO_NUMBER/text()');
          p_invoice        := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_INVOICE/text()');
          p_estimated_date := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_ESTIMATED_DATE/text()');
          p_boxes_qty      := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_BOXES_QTY/text()');
          p_trucks_qty     := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_TRUCKS_QTY/text()');
          p_item_process   := lf_get_value(l_xml_param,
                                           '/ROOT/PARAM/P_ITEM_PROCESS/text()');
          /*P_ARRIVED_DATE := LF_GET_VALUE(L_XML_PARAM,
          '/ROOT/PARAM/P_ARRIVED_DATE/text()');*/
          p_state  := lf_get_value(l_xml_param,
                                   '/ROOT/PARAM/P_STATE/text()');
          p_remark := lf_get_value(l_xml_param,
                                   '/ROOT/PARAM/P_REMARK/text()');
          update lmes_bba_rcv_reg_pre
             set pre_id         = p_pre_id,
                 rcv_type       = p_rcv_type,
                 supplier_name  = p_supplier_name,
                 po_number      = p_po_number,
                 invoice        = p_invoice,
                 estimated_date = to_date(p_estimated_date,
                                          'mm/dd/yyyy hh24:mi:ss'),
                 boxes_qty      = p_boxes_qty,
                 item_process   = p_item_process,
                 trucks_qty     = p_trucks_qty,
                 state          = p_state,
                 --ARRIVED_DATE = P_ARRIVED_DATE,
                 remark           = p_remark,
                 last_update_by   = l_op_by,
                 last_update_date = sysdate
           where pre_id = p_pre_id;
          commit; --提交
          p_status  := 'OK';
          p_message := 'Success';
        exception
          when others then
            begin
              rollback; --回滚
              p_status  := 'FAIL';
              p_message := substr(sqlcode || sqlerrm, 1, 200);
            end;
        end;
      when 'PRE_DELETE_INFO' then
        /* --XML_PARAM 格式要求:
        <ROOT>
        <FUNCTION>PRE_DELETE_INFO</FUNCTION>
        <OP_BY>实际用户名</OP_BY>
        <PARAM>
        <P_PRE_ID>P_PRE_ID</P_PRE_ID>
        </PARAM>
        </ROOT>
        */
      
        begin
          p_pre_id := lf_get_value(l_xml_param,
                                   '/ROOT/PARAM/P_PRE_ID/text()');
          delete lmes_bba_rcv_reg_pre where pre_id = p_pre_id;
          commit; --提交
          p_status  := 'OK';
          p_message := 'Success';
        exception
          when others then
            begin
              rollback; --回滚
              p_status  := 'FAIL';
              p_message := substr(sqlcode || sqlerrm, 1, 200);
            end;
        end;
      else
        p_message := 'Undefined FUNCTION:' || l_function;
    end case;
  end;
end pkg_bba_rcv_pre;
复制代码

 

posted on   失落''80  阅读(145)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示