第一个oracle存储过程

本文介绍了一个Oracle存储过程,用于汽车总装生产线中的拣配单生成及强制生单功能。该过程首先检查物料是否已分配,然后通过复杂的业务逻辑生成拣配单,并确保所有操作符合生产线的实际需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

oracle刚开始接触,第一次写oracle的存储过程,在升级上线的时候又做了一些调整,功能为汽车总装生产线中生成拣配单和强制生单的两个功能

生成拣配单功能:

create or replace procedure PDA_CREATEPICKBILL(in_scandate    in VARCHAR2, --扫描时间
                                               in_realorder   in INTEGER, --上线顺序
                                               in_pullpoint   in VARCHAR2, --拉动点
                                               in_carbatchno  in VARCHAR2, --整车批次号
                                               in_userID      in VARCHAR2, --用户
                                               in_produceLine in VARCHAR2, --生产线
                                               out_error      out varchar2 --空为正常
                                               ) AS
  -- vusingqty   varchar2(10); --占配数
  vPICKSEQ    varchar2(10); --拣配顺序
  VOutOrderID VARCHAR2(50); ---出库单号
  VOutBillID  VARCHAR2(50); 
  VPickID     VARCHAR2(50); ---拣配单号 
  RowNumber   integer; ---记录数
  V_realorder integer; ---当前项次
  v_Flag      integer;
  v_PlanDate  VARCHAR2(50);
begin

  out_error := '';
  RowNumber := 0;
  select count(1)
    into RowNumber
    from bo_orderdetail
   where carBATCHNO = in_carbatchno
     and state <> '1';
  if (RowNumber < 1) then
    out_error := '物料未分配,不允许扫描';
    return;
  end if;

  ---------------生成出库单号------------------------wtj 2013.11.10.1846
  vOutOrderID := SP_CREATEBILLNO.FC_GetOutOrderID_Four('DC', '2', in_userID);

  IF vOutOrderID is null THEN
    out_error := ('出库单号生成失败');
    return;
  END IF;

  vPICKSEQ := 0;

  ------------------取出当前生产线的最大统计项次

  ---如果没拉动点添加拉动点
  RowNumber := 1;
  select count(1)
    into RowNumber
    from Z_PULLPOINT_REALORDER
   where PULLPOINT = in_pullpoint
     and PRODUCELINE = in_produceLine;
  if (RowNumber < 1) then
    out_error := '没有维护z_pullpoint_realorder生产线拉动点计数表';
    return;
  end if;

  ---如果跨月清0 数据
  select plandate
    into v_PlanDate
    from bo_pickorder
   where batchno = in_carbatchno;
  RowNumber := 1;
  select count(1)
    into RowNumber
    from Z_PULLPOINT_REALORDER
   where plandate = substr(v_PlanDate, 0, 6);
  if (RowNumber < 1) then
    update Z_PULLPOINT_REALORDER
       set REALORDER = 0, plandate = substr(v_PlanDate, 0, 6);
  end if;

  ---将该拉动点的数据加1
  update Z_PULLPOINT_REALORDER
     set REALORDER = REALORDER + 1
   where PULLPOINT = in_pullpoint
     and PRODUCELINE = in_produceLine;

  --获得该拉动点的最大项次

  select realorder
    into V_realorder
    from Z_PULLPOINT_REALORDER
   where PULLPOINT = in_pullpoint
     and PRODUCELINE = in_produceLine;
     
     

  ---------筐栏件  生成单规则
  FOR cur_OnePickBill in (select WORKPLACE, ---工位
                                 WAREHOUSEID, ---库房
                                 TOOLID, ---箱号
                                 KEEPER, ---保管员
                                 CPICKER, ---拣配员
                                 MAX(LINEID) AS LINEID, ---生产线
                                 DEPTID, ---部门
                                 deskcopies, ---器具容量
                                 Max(PLANDATE) as PLANDATE ---计划上线日期
                          --Max(realorder) as realorder
                            from bo_outdetail_pull A
                           WHERE PICKBILLSTATE = '0'
                             and pullpoint = in_pullpoint
                             and sendway = '04'
                             and ((Scandate = in_scandate and
                                 REALORDER <= in_realorder) or
                                 Scandate < in_scandate)
                             and exists
                           (select 1
                                    from alxmz.z_ppwscode@cmmpzs B
                                   where A.Lineid = B.productline
                                     and B.produceline = in_produceLine
                                     and A.Deptid = B.WSCODE)
                           group by WORKPLACE,
                                    TOOLID,
                                    WAREHOUSEID,
                                    KEEPER,
                                    CPICKER,
                                    DEPTID,
                                    deskcopies)
  /*筛选条件为:配送方式为排序,生成简配单状态为0,当前拉动点,扫描时间和项次小于当前*/
   loop
    vPICKSEQ   := vPICKSEQ + 1;
    VPickID    := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');
    v_Flag     := 0;

    vPICKSEQ   := vPICKSEQ + 1;
    VOutBillID := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');
    v_Flag     := 0;

    FOR cur_TwoPickBill in (select detailid, deskcopies
                              from bo_outdetail_pull A
                             where WORKPLACE = cur_OnePickBill.Workplace
                               and WAREHOUSEID = cur_OnePickBill.Warehouseid
                               and TOOLID = cur_OnePickBill.Toolid
                               and KEEPER = cur_OnePickBill.KEEPER
                               and CPICKER = cur_OnePickBill.CPICKER
                               and DEPTID = cur_OnePickBill.DEPTID
                               and deskcopies = cur_OnePickBill.deskcopies
                               and sendway = '04'
                               and PICKBILLSTATE = '0'
                               and pullpoint = in_pullpoint
                               and ((Scandate = in_scandate and
                                   REALORDER <= in_realorder) or
                                   Scandate < in_scandate)
                               and exists
                             (select 1
                                      from alxmz.z_ppwscode@cmmpzs B
                                     where A.Lineid = B.productline
                                       and B.produceline = in_produceLine
                                       and A.Deptid = B.WSCODE)
                         

                             ORDER BY Scandate, REALORDER asc) loop

       update bo_outdetail_pull
           set PICKID = VPickID;
         where detailid = cur_TwoPickBill.detailid;

      if (MOD(V_realorder, cur_TwoPickBill.deskcopies) = 0) then
       
        update bo_outdetail_pull
           set PICKID = VOutBillID
         where detailid = cur_TwoPickBill.detailid;
        v_Flag := v_Flag + 1;     
      end if;

    END LOOP;
    if (v_Flag > 0) then
      insert into BO_PICKBILL_PULL
        (PICKID,
         WAREHOUSEID,
         LINEID,
         DEPTID,
         KEEPER,
         PICKER,
         WORKPLACE,
         TOOLID,
         deskcopies,
         PLANDATE,
         sendway,
         PRODUCELINE)
      VALUES
        (VOutBillID,
         cur_OnePickBill.WAREHOUSEID,
         cur_OnePickBill.LINEID,
         cur_OnePickBill.DEPTID,
         cur_OnePickBill.KEEPER,
         cur_OnePickBill.CPICKER,
         cur_OnePickBill.WORKPLACE,
         cur_OnePickBill.TOOLID,
         cur_OnePickBill.deskcopies,
         substr(cur_OnePickBill.PLANDATE, 0, 6),
         '04',
         in_produceLine);

      update bo_outdetail_pull
         set PICKBILLSTATE = '2'
       where PICKID = VOutBillID;

    end if;
  END LOOP;


  --------排序件  生成单规则
  FOR cur_OnePickBill in (select WORKPLACE, ---工位
                                 WAREHOUSEID, ---库房
                                 TOOLID, ---箱号
                                 KEEPER, ---保管员
                                 CPICKER, ---拣配员
                                 MAX(LINEID) AS LINEID, ---生产线
                                 DEPTID, ---部门
                                 deskcopies, ---器具容量
                                 Max(PLANDATE) as PLANDATE ---计划上线日期                         
                            from bo_outdetail_pull A
                           WHERE PICKBILLSTATE = '0'
                             and pullpoint = in_pullpoint
                             and sendway = '02'
                             and ((Scandate = in_scandate and
                                 REALORDER <= in_realorder) or
                                 Scandate < in_scandate)
                             and exists
                           (select 1
                                    from alxmz.z_ppwscode@cmmpzs B
                                   where A.Lineid = B.productline
                                     and B.produceline = in_produceLine
                                     and A.Deptid = B.WSCODE)
                           group by WORKPLACE,
                                    TOOLID,
                                    WAREHOUSEID,
                                    KEEPER,
                                    CPICKER,
                                    DEPTID,
                                    deskcopies)
  /*筛选条件为:配送方式为排序,生成简配单状态为0,当前拉动点,扫描时间和项次小于当前*/
   loop
    vPICKSEQ   := vPICKSEQ + 1;
    VPickID    := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');
    v_Flag     := 0;

    vPICKSEQ   := vPICKSEQ + 1;
    VOutBillID := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');
    v_Flag     := 0;

    FOR cur_TwoPickBill in (select detailid, deskcopies
                              from bo_outdetail_pull A
                             where WORKPLACE = cur_OnePickBill.Workplace
                               and WAREHOUSEID = cur_OnePickBill.Warehouseid
                               and TOOLID = cur_OnePickBill.Toolid
                               and KEEPER = cur_OnePickBill.KEEPER
                               and CPICKER = cur_OnePickBill.CPICKER
                               and DEPTID = cur_OnePickBill.DEPTID
                               and deskcopies = cur_OnePickBill.deskcopies
                               and sendway = '02'
                               and PICKBILLSTATE = '0'
                               and pullpoint = in_pullpoint
                               and ((Scandate = in_scandate and
                                   REALORDER <= in_realorder) or
                                   Scandate < in_scandate)
                               and exists
                             (select 1
                                      from alxmz.z_ppwscode@cmmpzs B
                                     where A.Lineid = B.productline
                                       and B.produceline = in_produceLine
                                       and A.Deptid = B.WSCODE)                         

                             ORDER BY Scandate, REALORDER asc) loop
        update bo_outdetail_pull
           set PICKID = VPickID;
         where detailid = cur_TwoPickBill.detailid;
      if (MOD(V_realorder, cur_TwoPickBill.deskcopies) = 0) then
        
        update bo_outdetail_pull
           set PICKID = VOutBillID
         where detailid = cur_TwoPickBill.detailid;
        v_Flag := v_Flag + 1;
      end if;

    END LOOP;
    if (v_Flag > 0) then
      insert into BO_PICKBILL_PULL
        (PICKID,
         WAREHOUSEID,
         LINEID,
         DEPTID,
         KEEPER,
         PICKER,
         WORKPLACE,
         TOOLID,
         deskcopies,
         PLANDATE,
         sendway,
         PRODUCELINE)
      VALUES
        (VOutBillID,
         cur_OnePickBill.WAREHOUSEID,
         cur_OnePickBill.LINEID,
         cur_OnePickBill.DEPTID,
         cur_OnePickBill.KEEPER,
         cur_OnePickBill.CPICKER,
         cur_OnePickBill.WORKPLACE,
         cur_OnePickBill.TOOLID,
         cur_OnePickBill.deskcopies,
         substr(cur_OnePickBill.PLANDATE, 0, 6),
         '02',
         in_produceLine);

      update bo_outdetail_pull
         set PICKBILLSTATE = '2'
       where PICKID = VOutBillID;

    end if;
  END LOOP;

  -------------------------工位更改生成拣配单-----------------------
  FOR cur_OnePickBill in (select PICKID, Warehouseid
                            from bo_outdetail_pull A
                           where PICKBILLSTATE = '0'
                             and PICKID is not null
                             and pullpoint = in_pullpoint

                             and not exists
                           (select 1
                                    from alxmz.S_STATION_ITEM@cmmpzs B
                                   where A.PARTCODE = B.ITEMCODE
                                     and A.WORKPLACE = B.STATIONCODE
                                     and A.deptid = B.WORKSHOPCODE)
                           group by PICKID, Warehouseid) loop

    --工位字段与CMMP中S_STATION_ITEM工位物料对照表相匹配(零件号)PARTCODE对应ITEMCODE

    vPICKSEQ := vPICKSEQ + 1;

    VOutBillID := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');

    FOR cur_TwoPickBill in (select DETAILID, WORKPLACE, Partcode, DEPTID
                              from bo_outdetail_pull
                             where PICKID = cur_OnePickBill.PICKID) loop
      RowNumber := 1;
      select count(1)
        into RowNumber
        from alxmz.S_STATION_ITEM@cmmpzs
       where cur_TwoPickBill.PARTCODE = ITEMCODE
         and cur_TwoPickBill.WORKPLACE = STATIONCODE
         and cur_TwoPickBill.deptid = WORKSHOPCODE;
      if (RowNumber < 1) then
        update bo_outdetail_pull
           set PICKID = VOutBillID
         where DETAILID = cur_TwoPickBill.DETAILID;
      end if;
    END LOOP;

    insert into BO_PICKBILL_PULL
      (PICKID,
       WAREHOUSEID,
       LINEID,
       DEPTID,
       KEEPER,
       PICKER,
       WORKPLACE,
       TOOLID,
       PLANDATE,
       deskcopies,
       sendway,
       ERROCOLUMN,
       PRODUCELINE)
      (select VOutBillID,
              WAREHOUSEID,
              MAX(LINEID),
              DEPTID,
              KEEPER,
              CPICKER,
              WORKPLACE,
              TOOLID,
              max(substr(PLANDATE, 0, 6)),
              deskcopies,
              sendway,
              'WORKPLACE',
              in_produceLine
         from bo_outdetail_pull
        where PICKID = VOutBillID
        group by WORKPLACE,
                 TOOLID,
                 WAREHOUSEID,
                 KEEPER,
                 CPICKER,
                 DEPTID,
                 sendway,
                 deskcopies);

    update bo_outdetail_pull
       set PICKBILLSTATE = '2'
     where PICKID = VOutBillID;

  END LOOP;

  -------------------------库房更改生成拣配单------------------------
  FOR cur_OnePickBill in (select PICKID, Warehouseid
                            from bo_outdetail_pull A
                           where PICKBILLSTATE = '0'
                             and PICKID is not null
                             and pullpoint = in_pullpoint

                             and not exists
                           (select 1
                                    from base_material B
                                   where A.Materialid = B.Materialid
                                     and A.Warehouseid = B.Warehouseid)
                           group by PICKID, Warehouseid) loop

    --库房字段与WMS物料信息表(Base_Material),物料相对应的库房不匹配生成异常拣配单
    --只将该拣配单号下的异常物料生成新的拣配单

    vPICKSEQ := vPICKSEQ + 1;

    VOutBillID := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');

    FOR cur_TwoPickBill in (select DETAILID, Warehouseid, Materialid
                              from bo_outdetail_pull
                             where PICKID = cur_OnePickBill.PICKID) loop
      RowNumber := 1;
      select count(1)
        into RowNumber
        from base_material
       where cur_TwoPickBill.Materialid = Materialid
         and cur_TwoPickBill.Warehouseid = Warehouseid;
      if (RowNumber < 1) then
        update bo_outdetail_pull
           set PICKID = VOutBillID
         where DETAILID = cur_TwoPickBill.DETAILID;
      end if;
    END LOOP;

    insert into BO_PICKBILL_PULL
      (PICKID,
       WAREHOUSEID,
       LINEID,
       DEPTID,
       KEEPER,
       PICKER,
       WORKPLACE,
       TOOLID,
       PLANDATE,
       deskcopies,
       sendway,
       ERROCOLUMN,
       PRODUCELINE)
      (select VOutBillID,
              WAREHOUSEID,
              MAX(LINEID),
              DEPTID,
              KEEPER,
              CPICKER,
              WORKPLACE,
              TOOLID,
              max(substr(PLANDATE, 0, 6)),
              deskcopies,
              sendway,
              'WAREHOUSEID',
              in_produceLine
         from bo_outdetail_pull
        where PICKID = VOutBillID
        group by WORKPLACE,
                 TOOLID,
                 WAREHOUSEID,
                 KEEPER,
                 CPICKER,
                 DEPTID,
                 sendway,
                 deskcopies);

    update bo_outdetail_pull
       set PICKBILLSTATE = '2'
     where PICKID = VOutBillID;

  END LOOP;

  -------------------------保管员更改生成拣配单-----------------------
  FOR cur_OnePickBill in (select PICKID, Warehouseid
                            from bo_outdetail_pull A
                           where PICKBILLSTATE = '0'
                             and PICKID is not null
                             and pullpoint = in_pullpoint

                             and not exists
                           (select 1
                                    from base_material B
                                   where A.Materialid = B.Materialid
                                     and A.KEEPER = B.KEEPER)
                           group by PICKID, Warehouseid) loop
    --保管员字段与WMS物料信息表(Base_Material),物料相对应的保管员不匹配生成异常拣配单
    --只将该拣配单号下的异常物料生成新的拣配单

    vPICKSEQ := vPICKSEQ + 1;

    VOutBillID := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');

    FOR cur_TwoPickBill in (select DETAILID, KEEPER, Materialid
                              from bo_outdetail_pull
                             where PICKID = cur_OnePickBill.PICKID) loop
      RowNumber := 1;
      select count(1)
        into RowNumber
        from base_material
       where cur_TwoPickBill.Materialid = Materialid
         and cur_TwoPickBill.KEEPER = KEEPER;
      if (RowNumber < 1) then
        update bo_outdetail_pull
           set PICKID = VOutBillID
         where DETAILID = cur_TwoPickBill.DETAILID;
      end if;
    END LOOP;

    insert into BO_PICKBILL_PULL
      (PICKID,
       WAREHOUSEID,
       LINEID,
       DEPTID,
       KEEPER,
       PICKER,
       WORKPLACE,
       TOOLID,
       PLANDATE,
       deskcopies,
       sendway,
       ERROCOLUMN,
       PRODUCELINE)
      (select VOutBillID,
              WAREHOUSEID,
              MAX(LINEID),
              DEPTID,
              KEEPER,
              CPICKER,
              WORKPLACE,
              TOOLID,
              max(substr(PLANDATE, 0, 6)),
              deskcopies,
              sendway,
              'KEEPER',
              in_produceLine
         from bo_outdetail_pull
        where PICKID = VOutBillID
        group by WORKPLACE,
                 TOOLID,
                 WAREHOUSEID,
                 KEEPER,
                 CPICKER,
                 DEPTID,
                 sendway,
                 deskcopies);

    update bo_outdetail_pull
       set PICKBILLSTATE = '2'
     where PICKID = VOutBillID;

  END LOOP;

  -------------------------拣配员更改生成拣配单-----------------------
  FOR cur_OnePickBill in (select PICKID, Warehouseid
                            from bo_outdetail_pull A
                           where PICKBILLSTATE = '0'
                             and PICKID is not null
                             and pullpoint = in_pullpoint

                             and not exists
                           (select 1
                                    from base_material B
                                   where A.Materialid = B.Materialid
                                     and A.CPICKER = B.PICKER)
                           group by PICKID, Warehouseid) loop
    --拣配员字段与WMS物料信息表(Base_Material),物料相对应的拣配员不匹配生成异常拣配单
    --只将该拣配单号下的异常物料生成新的拣配单

    vPICKSEQ := vPICKSEQ + 1;

    VOutBillID := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');

    FOR cur_TwoPickBill in (select DETAILID, CPICKER, Materialid
                              from bo_outdetail_pull
                             where PICKID = cur_OnePickBill.PICKID) loop
      RowNumber := 1;
      select count(1)
        into RowNumber
        from base_material
       where cur_TwoPickBill.Materialid = Materialid
         and cur_TwoPickBill.CPICKER = PICKER;
      if (RowNumber < 1) then
        update bo_outdetail_pull
           set PICKID = VOutBillID
         where DETAILID = cur_TwoPickBill.DETAILID;
      end if;
    END LOOP;

    insert into BO_PICKBILL_PULL
      (PICKID,
       WAREHOUSEID,
       LINEID,
       DEPTID,
       KEEPER,
       PICKER,
       WORKPLACE,
       TOOLID,
       PLANDATE,
       deskcopies,
       sendway,
       ERROCOLUMN,
       PRODUCELINE)
      (select distinct VOutBillID,
                       WAREHOUSEID,
                       MAX(LINEID),
                       DEPTID,
                       KEEPER,
                       CPICKER,
                       WORKPLACE,
                       TOOLID,
                       max(substr(PLANDATE, 0, 6)),
                       deskcopies,
                       sendway,
                       'PICKER',
                       in_produceLine
         from bo_outdetail_pull
        where PICKID = VOutBillID
        group by WORKPLACE,
                 TOOLID,
                 WAREHOUSEID,
                 KEEPER,
                 CPICKER,
                 DEPTID,
                 sendway,
                 deskcopies);

    update bo_outdetail_pull
       set PICKBILLSTATE = '2'
     where PICKID = VOutBillID;

  END LOOP;

  --------------------------箱号更改生成拣配单-------------------------
  FOR cur_OnePickBill in (select PICKID, Warehouseid
                            from bo_outdetail_pull A
                           where PICKBILLSTATE = '0'
                             and PICKID is not null
                             and pullpoint = in_pullpoint

                             and not exists
                           (select 1
                                    from base_toolwp B
                                   where A.Toolid = B.TOOLID
                                     and A.WORKPLACE = B.WORKPLACE)
                           group by PICKID, Warehouseid) loop
    --箱号与WMS器具与工位关系对照表(base_toolwp),工位相对应的箱号不匹配生成异常拣配单

    insert into BO_PICKBILL_PULL
      (PICKID,
       WAREHOUSEID,
       LINEID,
       DEPTID,
       KEEPER,
       PICKER,
       WORKPLACE,
       TOOLID,
       PLANDATE,
       deskcopies,
       sendway,
       ERROCOLUMN,
       PRODUCELINE)
      (select cur_OnePickBill.Pickid,
              WAREHOUSEID,
              MAX(LINEID),
              DEPTID,
              KEEPER,
              CPICKER,
              WORKPLACE,
              TOOLID,
              max(substr(PLANDATE, 0, 6)),
              deskcopies,
              sendway,
              'TOOLID',
              in_produceLine
         from bo_outdetail_pull
        where PICKID = cur_OnePickBill.Pickid
        group by WORKPLACE,
                 TOOLID,
                 WAREHOUSEID,
                 KEEPER,
                 CPICKER,
                 DEPTID,
                 sendway,
                 deskcopies
                 );

    update bo_outdetail_pull
       set PICKBILLSTATE = '2'
     where PICKID = cur_OnePickBill.PICKID;

  end loop;

  --------------------------箱号容量更改生成拣配单----------------------
  FOR cur_OnePickBill in (select PICKID, Warehouseid
                            from bo_outdetail_pull A
                           where PICKBILLSTATE = '0'
                             and PICKID is not null
                             and pullpoint = in_pullpoint

                             and not exists
                           (select 1
                                    from base_toolwp B
                                   where A.Toolid = B.TOOLID
                                     and A.WORKPLACE = B.WORKPLACE
                                     and A.Deskcopies = B.Deskcopies)
                           group by PICKID, Warehouseid) loop

    --箱号容量与WMS器具与工位关系对照表(base_toolwp),工位、箱号相对应的箱号容量不匹配生成异常拣配单

    insert into BO_PICKBILL_PULL
      (PICKID,
       WAREHOUSEID,
       LINEID,
       DEPTID,
       KEEPER,
       PICKER,
       WORKPLACE,
       TOOLID,
       PLANDATE,
       deskcopies,
       sendway,
       ERROCOLUMN,
       PRODUCELINE)
      (select cur_OnePickBill.Pickid,
              WAREHOUSEID,
              MAX(LINEID),
              DEPTID,
              KEEPER,
              CPICKER,
              WORKPLACE,
              TOOLID,
              max(substr(PLANDATE, 0, 6)),
              deskcopies,
              sendway,
              'DESKCOPIES',
              in_produceLine
         from bo_outdetail_pull
        where PICKID = cur_OnePickBill.Pickid
        group by WORKPLACE,
                 TOOLID,
                 WAREHOUSEID,
                 KEEPER,
                 CPICKER,
                 DEPTID,
                 sendway,
                 deskcopies);

    update bo_outdetail_pull
       set PICKBILLSTATE = '2'
     where PICKID = cur_OnePickBill.PICKID;

  end loop;

  -------------------------拉动点更改生成拣配单--------------------------
  FOR cur_OnePickBill in (select PICKID, Warehouseid
                            from bo_outdetail_pull A
                           where PICKBILLSTATE = '0'
                             and PICKID is not null
                             and pullpoint = in_pullpoint

                             and not exists
                           (select 1
                                    from alxmz.z_drivingpoint@cmmpzs B
                                   where A.pullpoint = B.SPOINT
                                     and A.WORKPLACE = B.STATIONCODE)
                           group by PICKID, Warehouseid) loop
    --拉动点与CMMP中z_drivingpoint相对应,工位相对应拉动点不匹配生成异常拣配单

    insert into BO_PICKBILL_PULL
      (PICKID,
       WAREHOUSEID,
       LINEID,
       DEPTID,
       KEEPER,
       PICKER,
       WORKPLACE,
       TOOLID,
       PLANDATE,
       deskcopies,
       sendway,
       ERROCOLUMN,
       PRODUCELINE)
      (select cur_OnePickBill.Pickid,
              WAREHOUSEID,
              MAX(LINEID),
              DEPTID,
              KEEPER,
              CPICKER,
              WORKPLACE,
              TOOLID,
              max(substr(PLANDATE, 0, 6)),
              deskcopies,
              sendway,
              'PULLPOINT',
              in_produceLine
         from bo_outdetail_pull
        where PICKID = cur_OnePickBill.Pickid
        group by WORKPLACE,
                 TOOLID,
                 WAREHOUSEID,
                 KEEPER,
                 CPICKER,
                 DEPTID,
                 sendway,
                 deskcopies);

    update bo_outdetail_pull
       set PICKBILLSTATE = '2'
     where PICKID = cur_OnePickBill.PICKID;

  end loop;

  ------------------------拉动方式更改生成拣配单-------------------------
  FOR cur_OnePickBill in (select PICKID, Warehouseid
                            from bo_outdetail_pull A
                           WHERE PICKBILLSTATE = '0'
                             and PICKID is not null
                             and pullpoint = in_pullpoint
                             and vendorid <> 'A2080'
                             and not exists
                           (select 1
                                    from alxmz.b_send_workshopflag@cmmpzs B
                                   where A.sendway = B.sendflag
                                     and A.Partcode = B.partcode
                                     and A.deptid = B.workshopcode)
                           group by PICKID, Warehouseid)

   loop
    --拉动方式与CMMP中b_send_workshopflag相对应,部门,零件号相对应拉动点不匹配生成异常拣配单
    ----只将该拣配单号下的异常物料生成新的拣配单

    vPICKSEQ := vPICKSEQ + 1;

    VOutBillID := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');

    FOR cur_TwoPickBill in (select DETAILID, sendway, Partcode, DEPTID
                              from bo_outdetail_pull
                             where PICKID = cur_OnePickBill.PICKID) loop
      RowNumber := 1;
      select count(1)
        into RowNumber
        from alxmz.b_send_workshopflag@cmmpzs
       where cur_TwoPickBill.sendway = sendflag
         and cur_TwoPickBill.Partcode = partcode
         and cur_TwoPickBill.deptid = workshopcode;
      if (RowNumber < 1) then
        update bo_outdetail_pull
           set PICKID = VOutBillID
         where DETAILID = cur_TwoPickBill.DETAILID;
      end if;
    END LOOP;

    insert into BO_PICKBILL_PULL
      (PICKID,
       WAREHOUSEID,
       LINEID,
       DEPTID,
       KEEPER,
       PICKER,
       WORKPLACE,
       TOOLID,
       PLANDATE,
       deskcopies,
       sendway,
       ERROCOLUMN,
       PRODUCELINE)
      (select distinct VOutBillID,
                       WAREHOUSEID,
                       MAX(LINEID),
                       DEPTID,
                       KEEPER,
                       CPICKER,
                       WORKPLACE,
                       TOOLID,
                       max(substr(PLANDATE, 0, 6)),
                       deskcopies,
                       sendway,
                       'SENDWAY',
                       in_produceLine
         from bo_outdetail_pull
        where PICKID = VOutBillID
        group by WORKPLACE,
                 TOOLID,
                 WAREHOUSEID,
                 KEEPER,
                 CPICKER,
                 DEPTID,
                 sendway,
                 deskcopies);

    update bo_outdetail_pull
       set PICKBILLSTATE = '2'
     where PICKID = VOutBillID;
  END LOOP;

  ------------------------插入WMS数据-------------------------

  ---------插入BO_PICKBILL表,将STATE作为标志,先将符合条件的state更改为0---------

  update BO_PICKBILL_PULL
     set state = '0'
   where WMSSTATE = '0'
     and PLANDATE <= TO_CHAR(SYSDATE, 'yyyymm');

  insert into BO_PICKBILL
    (PICKID,
     WAREHOUSEID,
     --LINEID,
     DEPTID,
     KEEPER,
     PICKER,
     WORKPLACE,
     TOOLID,
     DDATE,
     BPRINT,
     PRINTCOUNT,
     orderid,
     outid)
    select A.pickID,
           A.WAREHOUSEID,
           --A.LINEID,
           A.DEPTID,
           A.KEEPER,
           A.PICKER,
           A.WORKPLACE,
           A.TOOLID,
           A.DDATE,
           1,
           99999,
           'LaDongOrderId',
           'LaDongOutId'
      from BO_PICKBILL_PULL A
     where A.state = '0'
       and exists (select 1
              from bo_outdetail_pull d
             where a.pickid = d.pickid
               and d.ifemptybill <> '1');

  update BO_PICKBILL_PULL
     set WMSSTATE = '1'
   where WMSSTATE = '0'
     and state = '0';

  ----------插入BO_PICKBILL后将WMSSTATE更改标志

  insert into BO_OUTDETAIL
    (DETAILID,
     OUTID,
     VENDORID,
     MATERIALID,
     BATCHNO,
     REQQTY,
     USINGQTY,
     UNIT,
     BINID,
     WAREHOUSEID,
     AREAID,
     SHELFID,
     ROWNO,
     COLNO,
     STATE,
     ASSIGNER,
     ASSIGNDATE,
     PICKER,
     PICKDATE,
     OUTPERSON,
     OUTDATE,
     VERIFYMAN,
     VERIFYDATE,
     SOURCEID,
     LINEID,
     VALID,
     OPERDATE,
     IP,
     OUTDETAILID,
     OPERSTATE,
     MATERIALSTATE,
     REASONID,
     WORKPLACE,
     DAYCLEAR,
     PRINTSTATE,
     PRINTIP,
     PERIOD,
     PICKQTY,
     OUTQTY,
     CONFIRMQTY,
     CARCODE,
     CARORDERNO,
     CARBATCHNO,
     CARSEQUENCE,
     OLDVENDORID,
     BMODIFY,
     TRANSFER,
     CPICKER,
     CHECKYEAR,
     CHECKMONTH,
     SENDWAY,
     SEEBORDNO,
     SEEBORDCODE,
     SENDWAYCODE,
     TOOLID,
     DESKCOPIES,
     PICKSEQ,
     PICKNO,
     KEEPER,
     ISCOMPLETE,
     CMPWORKPLACE,
     OPERATOR,
     EXPORTSFLAG,
     DEPTID,
     PICKID,
     BRETURN,
     BILLTYPE,
     TIMEZONE)
    select DETAILID,
           OUTID,
           VENDORID,
           MATERIALID,
           BATCHNO,
           REQQTY,
           USINGQTY,
           UNIT,
           BINID,
           WAREHOUSEID,
           AREAID,
           SHELFID,
           ROWNO,
           COLNO,
           STATE,
           ASSIGNER,
           ASSIGNDATE,
           PICKER,
           PICKDATE,
           OUTPERSON,
           OUTDATE,
           VERIFYMAN,
           VERIFYDATE,
           SOURCEID,
           LINEID,
           VALID,
           OPERDATE,
           IP,
           OUTDETAILID,
           OPERSTATE,
           MATERIALSTATE,
           REASONID,
           WORKPLACE,
           DAYCLEAR,
           PRINTSTATE,
           PRINTIP,
           PERIOD,
           PICKQTY,
           OUTQTY,
           CONFIRMQTY,
           CARCODE,
           CARORDERNO,
           CARBATCHNO,
           CARSEQUENCE,
           OLDVENDORID,
           BMODIFY,
           TRANSFER,
           CPICKER,
           CHECKYEAR,
           CHECKMONTH,
           SENDWAY,
           SEEBORDNO,
           SEEBORDCODE,
           SENDWAYCODE,
           TOOLID,
           DESKCOPIES,
           PICKSEQ,
           PICKNO,
           KEEPER,
           ISCOMPLETE,
           CMPWORKPLACE,
           OPERATOR,
           EXPORTSFLAG,
           DEPTID,
           PICKID,
           BRETURN,
           BILLTYPE,
           TIMEZONE
      from bo_outdetail_pull A
     where A.Ifemptybill <> '1'
       and A.Pickbillstate = '2'
       and exists (select 1
              from BO_PICKBILL_PULL B
             where B.state = '0'
               and B.Wmsstate = '1'
               and A.Pickid = B.Pickid);

  -------------生成拣配单并将BO_OUTDETAIL插入原表后,将BO_OUT_PULL的CREATEFLAG更改

  update bo_out_pull c
     set c.CREATEFLAG = '1'
   where exists (select 1
            from Bo_Outdetail_Pull A
            join BO_PICKBILL_PULL B
              on A.PICKID = B.PICKID
           WHERE A.PICKBILLSTATE = '2'
             AND B.STATE = '0'
             AND B.WMSSTATE = '1'
             AND c.OUTID = A.OUTID);

  -------------------
  insert into BO_OUT
    (OUTID,
     REFNO,
     DEPTID,
     WAREHOUSEID,
     OUTTYPE,
     LOGICHOUSEID,
     STATE,
     LINEID,
     VALID,
     REMARK,
     OPERATOR,
     OPERDATE,
     IP,
     DOOR,
     KEEPER,
     PICKER,
     WORKPLACE,
     PLANDATE,
     TIMEZONE,
     PRINTSTATE,
     PRINTIP,
     CREATEFLAG)
    select OUTID,
           REFNO,
           DEPTID,
           WAREHOUSEID,
           OUTTYPE,
           LOGICHOUSEID,
           STATE,
           LINEID,
           VALID,
           REMARK,
           OPERATOR,
           OPERDATE,
           IP,
           DOOR,
           KEEPER,
           PICKER,
           WORKPLACE,
           PLANDATE,
           TIMEZONE,
           PRINTSTATE,
           PRINTIP,
           CREATEFLAG
      from bo_out_pull
     where CREATEFLAG = '1'
       and ifadd = '0';

  update bo_out_pull
     set ifadd = '1'
   where CREATEFLAG = '1'
     AND ifadd = '0';

  update BO_PICKBILL_PULL
     set state = '1'
   where WMSSTATE = '1'
     and state = '0';

end PDA_CREATEPICKBILL;

强制生单功能:

create or replace procedure PDA_Forced_Createpickbill(in_deptid      in VARCHAR2, --车间
                                                      in_produceLine in VARCHAR2, --生产线
                                                      in_userID      in VARCHAR2, --用户
                                                      out_success    out varchar2 --成功 1成功 0失败
                                                      ) as
  VOutOrderID VARCHAR2(50); ---出库单号
  VOutBillID  VARCHAR2(50); ---拣配单号
  vPICKSEQ    varchar2(10); --拣配顺序
  v_ErroText  varchar2(200); --错误信息
  v_Sysdate   varchar2(10); --时间
  v_Row       integer;
  v_Count     integer;
  v_Flag     integer;
begin
  vPICKSEQ    := 0;
  vOutOrderID := SP_CREATEBILLNO.FC_GetOutOrderID_Four('DC', '2', in_userID);
  IF vOutOrderID is null THEN
    raise_application_error('-20002', '出库单号生成失败');
  END IF;
  v_Sysdate  := To_char(sysdate, 'yyyymmdd');
  v_ErroText := null;

  ---------------将bo_outdetail_pull中批次号的扫描点信息插入到强制生单临时表---------------

  insert into alxmz.TMP_FORCEDCREATE@cmmpzs
    (BARCODE, SCANPOINT)
    (select distinct barcode, scanpoint
       from ((select distinct barcode, scanpoint
                from alxmz.z_pdainfolog@cmmpzs A
               where exists (select 1
                        from bo_outdetail_pull C
                       where C.pickbillstate <> '2'
                         and C.realorder is not null
                         and A.barcode = C.carbatchno)) union
            
             (select barcode, scanpoint
                from alxmz.z_pdainfo@cmmpzs B
               where exists (select 1
                        from bo_outdetail_pull C
                       where C.pickbillstate <> '2'
                         and C.realorder is not null
                         and B.barcode = C.carbatchno)))
     
     );
  
  v_Row       := 0;
  --------------------------强制拉动-----------------wtj2013.11.10.1842更新
  FOR cur_OnePickBill in (select WORKPLACE, ---工位
                                 WAREHOUSEID, ---库房
                                 TOOLID, ---箱号
                                 KEEPER, ---保管员
                                 CPICKER, ---拣配员
                                 SENDWAY,
                                 pullpoint,
                                 MAX(LINEID) as LINEID, ---生产线
                                 DEPTID, ---部门
                                 deskcopies, ---器具容量
                                 MAX(PLANDATE) AS PLANDATE ---计划上线日期
                            from bo_outdetail_pull A
                           where --(sendway = '02' or sendway = '04')取消判断 and
                           PICKBILLSTATE = '0'
                          --and Ifemptybill <> '1'  空的也强制生单
                       and Scandate < = v_Sysdate --变成小于等于
                       and DEPTID = in_deptid
                       and REALORDER is not null
                       and exists (select 1
                              from alxmz.z_ppwscode@cmmpzs B
                             where A.Lineid = B.productline
                               and B.produceline = in_produceLine
                               and A.Deptid = B.WSCODE)
                           group by WORKPLACE,
                                    TOOLID,
                                    WAREHOUSEID,
                                    KEEPER,
                                    CPICKER,
                                    DEPTID,
                                    deskcopies,
                                    sendway,
                                    pullpoint)
  /*筛选条件为:生成简配单状态为0,当前拉动点,扫描时间和项次小于当前*/
   loop
    ----拣配顺序加
    vPICKSEQ := vPICKSEQ + 1;
    --生成拣配单耗--
    VOutBillID := vOutOrderID || '_' || LPAD(vPICKSEQ, 3, '0');
    v_Flag:=0;
  
    FOR cur_TwoPickBill in (select DETAILID, carbatchno
                              from bo_outdetail_pull A
                             where WORKPLACE = cur_OnePickBill.Workplace
                               and WAREHOUSEID = cur_OnePickBill.Warehouseid
                               and TOOLID = cur_OnePickBill.Toolid
                               and KEEPER = cur_OnePickBill.KEEPER
                               and CPICKER = cur_OnePickBill.CPICKER
                               and DEPTID = cur_OnePickBill.DEPTID
                               and sendway = cur_OnePickBill.SENDWAY
                               and pullpoint = cur_OnePickBill.pullpoint
                               and PICKBILLSTATE = '0'
                                  --and Ifemptybill <> '1'  同上
                               and Scandate <= v_Sysdate --同上
                               and REALORDER is not null
                               and exists
                             (select 1
                                      from alxmz.z_ppwscode@cmmpzs B
                                     where A.Lineid = b.productline
                                       and B.produceline = in_produceLine
                                       and A.Deptid = B.WSCODE)
                             ORDER BY Scandate, REALORDER asc) loop
    
      ------判断该物料的所在批次所在的扫描点,与该物料的扫描点相符将处罚改拉动点物料的扫描
      v_Count := 0;
      select count(1)
        into v_Count
        from alxmz.TMP_FORCEDCREATE@cmmpzs A
       where A.BARCODE = cur_TwoPickBill.carbatchno
         and A.SCANPOINT = cur_OnePickBill.Pullpoint;
      if (v_Count > 0) then
        update bo_outdetail_pull
           set PICKID = VOutBillID, PICKBILLSTATE = '2'
         where DETAILID = cur_TwoPickBill.DETAILID;
         v_Flag:=v_Flag+1;
      end if;
    END LOOP;
    
    if(v_Flag>0) then
    insert into BO_PICKBILL_PULL
      (PICKID,
       WAREHOUSEID,
       LINEID,
       DEPTID,
       KEEPER,
       PICKER,
       WORKPLACE,
       TOOLID,
       deskcopies,
       sendway,
       PLANDATE,
       ERROCOLUMN,
       PRODUCELINE)
    VALUES
      (VOutBillID,
       cur_OnePickBill.WAREHOUSEID,
       cur_OnePickBill.LINEID,
       cur_OnePickBill.DEPTID,
       cur_OnePickBill.KEEPER,
       cur_OnePickBill.CPICKER,
       cur_OnePickBill.WORKPLACE,
       cur_OnePickBill.TOOLID,
       cur_OnePickBill.deskcopies,
       cur_OnePickBill.sendway,
       substr(cur_OnePickBill.PLANDATE, 0, 6),
       'Forced',
       in_produceLine);
    v_row := v_row + 1;
    end if;

  
  END LOOP;

  if v_row = 0 then
    out_success := '2';
    return;
  end if;

  ------------------------插入WMS数据-------------------------

  ---------插入BO_PICKBILL表,将STATE作为标志,先将符合条件的state更改为0---------

  update BO_PICKBILL_PULL
     set state = '0'
   where WMSSTATE = '0'
     and PLANDATE <= TO_CHAR(SYSDATE, 'yyyymm');

  insert into BO_PICKBILL
    (PICKID,
     WAREHOUSEID,
     LINEID,
     DEPTID,
     KEEPER,
     PICKER,
     WORKPLACE,
     TOOLID,
     DDATE,
     BPRINT,
     PRINTCOUNT)
    select A.pickID,
           A.WAREHOUSEID,
           A.LINEID,
           A.DEPTID,
           A.KEEPER,
           A.PICKER,
           A.WORKPLACE,
           A.TOOLID,
           A.DDATE,
           1,
           99999
        from BO_PICKBILL_PULL A
     where A.state = '0'
     and exists (select 1
              from bo_outdetail_pull d
             where a.pickid = d.pickid
               and d.ifemptybill <> '1');

  update BO_PICKBILL_PULL
     set WMSSTATE = '1'
   where WMSSTATE = '0'
     and state = '0';

  ----------插入BO_PICKBILL后将WMSSTATE更改标志

  insert into BO_OUTDETAIL
    (DETAILID,
     OUTID,
     VENDORID,
     MATERIALID,
     BATCHNO,
     REQQTY,
     USINGQTY,
     UNIT,
     BINID,
     WAREHOUSEID,
     AREAID,
     SHELFID,
     ROWNO,
     COLNO,
     STATE,
     ASSIGNER,
     ASSIGNDATE,
     PICKER,
     PICKDATE,
     OUTPERSON,
     OUTDATE,
     VERIFYMAN,
     VERIFYDATE,
     SOURCEID,
     LINEID,
     VALID,
     OPERDATE,
     IP,
     OUTDETAILID,
     OPERSTATE,
     MATERIALSTATE,
     REASONID,
     WORKPLACE,
     DAYCLEAR,
     PRINTSTATE,
     PRINTIP,
     PERIOD,
     PICKQTY,
     OUTQTY,
     CONFIRMQTY,
     CARCODE,
     CARORDERNO,
     CARBATCHNO,
     CARSEQUENCE,
     OLDVENDORID,
     BMODIFY,
     TRANSFER,
     CPICKER,
     CHECKYEAR,
     CHECKMONTH,
     SENDWAY,
     SEEBORDNO,
     SEEBORDCODE,
     SENDWAYCODE,
     TOOLID,
     DESKCOPIES,
     PICKSEQ,
     PICKNO,
     KEEPER,
     ISCOMPLETE,
     CMPWORKPLACE,
     OPERATOR,
     EXPORTSFLAG,
     DEPTID,
     PICKID,
     BRETURN,
     BILLTYPE,
     TIMEZONE)
    select DETAILID,
           OUTID,
           VENDORID,
           MATERIALID,
           BATCHNO,
           REQQTY,
           USINGQTY,
           UNIT,
           BINID,
           WAREHOUSEID,
           AREAID,
           SHELFID,
           ROWNO,
           COLNO,
           STATE,
           ASSIGNER,
           ASSIGNDATE,
           PICKER,
           PICKDATE,
           OUTPERSON,
           OUTDATE,
           VERIFYMAN,
           VERIFYDATE,
           SOURCEID,
           LINEID,
           VALID,
           OPERDATE,
           IP,
           OUTDETAILID,
           OPERSTATE,
           MATERIALSTATE,
           REASONID,
           WORKPLACE,
           DAYCLEAR,
           PRINTSTATE,
           PRINTIP,
           PERIOD,
           PICKQTY,
           OUTQTY,
           CONFIRMQTY,
           CARCODE,
           CARORDERNO,
           CARBATCHNO,
           CARSEQUENCE,
           OLDVENDORID,
           BMODIFY,
           TRANSFER,
           CPICKER,
           CHECKYEAR,
           CHECKMONTH,
           SENDWAY,
           SEEBORDNO,
           SEEBORDCODE,
           SENDWAYCODE,
           TOOLID,
           DESKCOPIES,
           PICKSEQ,
           PICKNO,
           KEEPER,
           ISCOMPLETE,
           CMPWORKPLACE,
           OPERATOR,
           EXPORTSFLAG,
           DEPTID,
           PICKID,
           BRETURN,
           BILLTYPE,
           TIMEZONE
      from bo_outdetail_pull A
     where A.Ifemptybill <> '1'
       and A.Pickbillstate = '2'
       and exists (select 1
              from BO_PICKBILL_PULL B
             where B.state = '0'
               and B.Wmsstate = '1'
               and A.Pickid = B.Pickid);

  -------------生成拣配单并将BO_OUTDETAIL插入原表后,将BO_OUT_PULL的CREATEFLAG更改

  update bo_out_pull c
     set c.CREATEFLAG = '1'
   where exists (select 1
            from Bo_Outdetail_Pull A
            join BO_PICKBILL_PULL B
              on A.PICKID = B.PICKID
           WHERE A.PICKBILLSTATE = '2'
             AND B.STATE = '0'
             AND B.WMSSTATE = '1'
             AND c.OUTID = A.OUTID);

  -------------------
  insert into BO_OUT
    (OUTID,
     REFNO,
     DEPTID,
     WAREHOUSEID,
     OUTTYPE,
     LOGICHOUSEID,
     STATE,
     LINEID,
     VALID,
     REMARK,
     OPERATOR,
     OPERDATE,
     IP,
     DOOR,
     KEEPER,
     PICKER,
     WORKPLACE,
     PLANDATE,
     TIMEZONE,
     PRINTSTATE,
     PRINTIP,
     CREATEFLAG)
    select OUTID,
           REFNO,
           DEPTID,
           WAREHOUSEID,
           OUTTYPE,
           LOGICHOUSEID,
           STATE,
           LINEID,
           VALID,
           REMARK,
           OPERATOR,
           OPERDATE,
           IP,
           DOOR,
           KEEPER,
           PICKER,
           WORKPLACE,
           PLANDATE,
           TIMEZONE,
           PRINTSTATE,
           PRINTIP,
           CREATEFLAG
      from bo_out_pull
     where CREATEFLAG = '1'
       and ifadd = '0';

  update bo_out_pull
     set ifadd = '1'
   where CREATEFLAG = '1'
     AND ifadd = '0';

  update BO_PICKBILL_PULL
     set state = '1'
   where WMSSTATE = '1'
     and state = '0';

  insert into alxmz.Z_PDASCANLOG@cmmpzs
    (SCANTIME, USERID, PRODUCTLINE, SUCCESS)
  values
    (SYSDATE, in_userID, in_produceLine, '是');
  out_success := '1';

EXCEPTION
  WHEN OTHERS THEN
    v_ErroText := SUBSTR(SQLERRM, 1, 200);
  
    if (v_ErroText is not null) then
      insert into alxmz.Z_PDASCANLOG@cmmpzs
        (SCANTIME, USERID, PRODUCTLINE, SUCCESS, ERRMSG)
      values
        (SYSDATE, in_userID, in_produceLine, '否', v_ErroText);
      out_success := '0';
    end if;
  
end PDA_Forced_Createpickbill;


开始编写Oracle存储过程前,您需要确保已经安装了PL/SQL Developer,它是Oracle数据库开发中不可或缺的工具之一。根据《PL/SQL Developer 11.0用户手册:Oracle客户端工具使用详解》的指导,以下是详细的步骤: 参考资源链接:[PL/SQL Developer 11.0用户手册:Oracle客户端工具使用详解](https://wenku.youkuaiyun.com/doc/5tf2kou3b6?spm=1055.2569.3001.10343) 1. **安装PL/SQL Developer**: - 确保您的计算机满足最低系统需求。 - 执行安装程序,按照向导完成安装。 - 若需要,可以使用提供的脚本自动化安装过程。 2. **登录到Oracle数据库**: - 启动PL/SQL Developer,点击工具栏上的'新建连接'。 - 输入连接信息,包括数据库的服务名、用户名和密码。 3. **编写存储过程**: - 在工具栏中选择新建'PL/SQL窗口',开始编写存储过程代码。 - 首先声明过程名称及参数,例如:`CREATE OR REPLACE PROCEDURE myProcedure IS`。 - 在过程体内编写所需的PL/SQL代码,例如插入或更新数据库记录。 - 使用`BEGIN ... END;`块来包裹过程的执行逻辑。 - 完成后,点击工具栏上的编译按钮,检查代码的语法错误。 4. **测试存储过程**: - 在PL/SQL窗口中,输入命令如`EXEC myProcedure;`来执行存储过程。 - 观察'输出'标签页中的结果,确保过程运行正常。 5. **调试存储过程**: - 如果遇到运行时错误,使用PL/SQL Developer的调试工具进行诊断。 - 在代码中设置断点,逐步执行代码,观察变量的变化。 6. **优化和调整**: - 使用工具提供的性能分析工具,如SQL执行计划,来优化代码。 - 根据需要调整逻辑,优化存储过程的性能。 以上步骤涵盖了从安装PL/SQL Developer到编写、测试、调试及优化您的第一个Oracle存储过程的全过程。更多高级功能和详细操作,您可以参考《PL/SQL Developer 11.0用户手册》中的对应章节,该手册提供了从基础到高级应用的全方位指导。 参考资源链接:[PL/SQL Developer 11.0用户手册:Oracle客户端工具使用详解](https://wenku.youkuaiyun.com/doc/5tf2kou3b6?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值