Oracle 存储过程 常用

CREATE OR REPLACE 
PROCEDURE CVCI_PANA_TRACE_XML( xml_data IN CLOB )
  IS
    line_name         VARCHAR(20);
    line_side         CHAR(1);
    front_char        CHAR(2);
    rear_char         CHAR(2);
    str_length        INT;
    l_xml_source      XMLType;
    stage_no          INT;
    stage_number      INT;
    insert_header     INT;
    MachineName       VARCHAR(20);
    PCBBarcode        VARCHAR(200);
    ProductName       VARCHAR(200);
    ProduceTime       VARCHAR(200);
    insert_PlacementCount INT;

    TYPE rec_header_data IS RECORD (
    plant_code        VARCHAR(10),
    mount_side        VARCHAR(5),
    machine_name      VARCHAR(5),
    lane_no           VARCHAR(5),
    boardnumber       VARCHAR(200),
    wip_sn            VARCHAR(50),
    program_name      VARCHAR(50),
    create_date       VARCHAR(30),
    line_mode         VARCHAR(10),
    job_status        VARCHAR(2),
    vendor_type       VARCHAR(10),
    last_machine      VARCHAR(5),
    stage_no          VARCHAR(5),
    entry_time        VARCHAR(30),
    release_time      VARCHAR(30),
    model_name        VARCHAR(50)
    );

    TYPE type_header_data IS TABLE OF rec_header_data INDEX BY BINARY_INTEGER;
    l_header_data_list type_header_data;

    TYPE rec_part_data IS RECORD (
    table_no          VARCHAR(5),
    slot_no           VARCHAR(5),
    sub_slot_no       VARCHAR(5),
    material_id       VARCHAR(50),
    parents_material_id VARCHAR(50),
    part_no           VARCHAR(50),
    real_part_no      VARCHAR(50),
    lot_code          VARCHAR(50),
    vendor_code       VARCHAR(50),
    data_code         VARCHAR(50),
    left_quantity     INT,
    operator_id       VARCHAR(50),
    used_time         VARCHAR(30),
    scan_time         VARCHAR(30),
    location_no       VARCHAR(50),
    pattern_no        INT
    );

  TYPE type_part_data IS TABLE OF rec_part_data INDEX BY binary_integer;
  l_part_data_list type_part_data;

BEGIN
  insert_header := 1;
  insert_PlacementCount := 0;
  l_xml_source := XMLType(xml_data);
  front_char := '_S';
  rear_char := '_C';
  line_name := l_xml_source.EXTRACT('/message/header/location/@routeName').getStringVal();
  MachineName := l_xml_source.EXTRACT('/message/header/location/@machineName').getStringVal();
  PCBBarcode := l_xml_source.EXTRACT('/message/body/panel/@pcbID').getStringVal();
  ProductName := l_xml_source.EXTRACT('/message/body/panel/@productName').getStringVal();
  ProduceTime := l_xml_source.EXTRACT('/message/body/panel/@startTime').getStringVal();
  stage_no := l_xml_source.EXTRACT('/message/body/stageNo/@value').getNumberVal();
  stage_number := l_xml_source.EXTRACT('/message/body/stageNo/@number').getNumberVal();
    -- Start Process XML data
  DBMS_OUTPUT.PUT_LINE('Parse XML ID:' || PCBBarcode || ' Line:' || line_name || ' Mc:' || MachineName || ' Stage:' || stage_no || ' Stage_Total:' || stage_number  || ' ProductName:' || ProductName  || ' ProduceTime:' || ProduceTime);
  str_length := LENGTH(line_name);
  IF (INSTR(line_name, front_char, -1, 1) = (str_length - 1) OR INSTR(line_name, rear_char, -1, 1) = (str_length - 1)) THEN
    line_side := SUBSTR(line_name,-1, 1);
    line_name := SUBSTR(line_name, 0, str_length - 2);
  ELSE
    line_side := l_xml_source.EXTRACT('/message/body/panel/@productSide').getStringVal();
  END IF;
  
  IF (stage_number >0 AND stage_no < stage_number) THEN
    insert_header := 0; 
  END IF;

  SELECT
    EXTRACTVALUE(VALUE(xml_body), '/message/header/location/@factoryName') AS plant_code,
    EXTRACTVALUE(VALUE(xml_body), '/message/body/panel/@productSide') AS mount_side,
    EXTRACTVALUE(VALUE(xml_body), '/message/header/location/@machineName') AS machine_name,
    EXTRACTVALUE(VALUE(xml_body), '/message/header/location/@laneNo') AS lane_no,
    EXTRACTVALUE(VALUE(xml_body), '/message/body/panel/@pcbID') AS boardnumber,
    EXTRACTVALUE(VALUE(xml_body), '/message/body/panel/@pcbID') AS wip_sn,
    EXTRACTVALUE(VALUE(xml_body), '/message/body/panel/@productName') AS program_name,
    EXTRACTVALUE(VALUE(xml_body), '/message/body/panel/@startTime') AS create_date,
    EXTRACTVALUE(VALUE(xml_body), '/message/header/location/@machineMode') AS line_mode,
    EXTRACTVALUE(VALUE(xml_body), '/message/header/location/@jobStatus') AS job_status,
    EXTRACTVALUE(VALUE(xml_body), '/message/header/location/@vendorType') AS vendor_type,
    EXTRACTVALUE(VALUE(xml_body), '/message/header/location/@lastMachine') AS last_machine,
    EXTRACTVALUE(VALUE(xml_body), '/message/body/stageNo/@output') AS stage_no,
    EXTRACTVALUE(VALUE(xml_body), '/message/body/panel/@startTime') AS entry_time,
    EXTRACTVALUE(VALUE(xml_body), '/message/body/panel/@endTime') AS release_time,
    EXTRACTVALUE(VALUE(xml_body), '/message/body/panel/@modelStr') AS model_name
  BULK COLLECT
  INTO l_header_data_list
  FROM TABLE(XMLSEQUENCE(EXTRACT(l_xml_source, '/message'))) xml_body;
  -- Insert Barcode into R_CVCI_BOARD_UNIT_INFO_T Table
  DBMS_OUTPUT.PUT_LINE('Start Insertion Table:UNIT_INFO_ ID:' || PCBBarcode || ' Mc:' || MachineName || ' Stage:' || stage_no);
  IF (l_header_data_list.COUNT > 0 AND insert_header = 1) THEN
    FOR i IN l_header_data_list.FIRST..l_header_data_list.LAST LOOP
      INSERT INTO CIMR.R_CVCI_BOARD_UNIT_INFO_T(
        PLANT_CODE,
        LINE_NAME,
        LINE_SIDE,
        MOUNT_SIDE,
        MACHINE_NAME,
        LANE_NO,
        BOARDNUMBER,
        WIP_SN,
        PROGRAM_NAME,
        CREATE_DATE,
        LINE_MODE,
        JOB_STATUS,
        VENDOR_TYPE ,
        LAST_MACHINE
      )
      VALUES (
        l_header_data_list(i).plant_code,
        line_name,
        line_side,
        l_header_data_list(i).mount_side,
        l_header_data_list(i).machine_name,
        l_header_data_list(i).lane_no,
        l_header_data_list(i).boardnumber,
        l_header_data_list(i).wip_sn,
        l_header_data_list(i).program_name,
        CAST(to_timestamp_tz(l_header_data_list(i).create_date,'MM/DD/YYYY HH24:MI:SS TZD') AS DATE),
        l_header_data_list(i).line_mode,
        l_header_data_list(i).job_status,
        l_header_data_list(i).vendor_type,
        l_header_data_list(i).last_machine
      );
    END LOOP;
  END IF;
  DBMS_OUTPUT.PUT_LINE('End__ Insertion Table:UNIT_INFO_ ID:' || PCBBarcode || ' Mc:' || MachineName || ' Stage:' || stage_no);
  SELECT
    EXTRACTVALUE(VALUE(xml_list), '/placement/@tableNo') AS table_no,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@p3') AS slot_no,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@p4') AS sub_slot_no,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@id') AS material_id,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@userdata3') AS parents_material_id,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@part') AS part_no,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@userdata4') AS real_part_no,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@lot') AS lot_code,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@vendor') AS vendor_code,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@userdata') AS data_code,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@qty') AS left_quantity,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@userdata5') AS operator_id,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@usedTime') AS used_time,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@timeon') AS scan_time,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@refDes') AS location_no,
    EXTRACTVALUE(VALUE(xml_list), '/placement/@pos') AS pattern_no
  BULK COLLECT
  INTO l_part_data_list
  FROM TABLE(XMLSEQUENCE(EXTRACT(l_xml_source, '/message/body/Placements/placement'))) xml_list;
-- Insert Barcode into R_CVCI_BOARD_TRACE_INFO_T Table
  DBMS_OUTPUT.PUT_LINE('Start Insertion Table:TRACE_INFO ID:' || PCBBarcode || ' Mc:' || MachineName || ' Stage:' || stage_no);
    IF (l_part_data_list.COUNT > 0) THEN
      FOR i IN l_part_data_list.FIRST..l_part_data_list.LAST LOOP
        IF(l_part_data_list(i).material_id is not null) THEN
          IF(l_part_data_list(i).real_part_no is not null) THEN
            l_part_data_list(i).part_no := l_part_data_list(i).real_part_no;
          END IF;
          INSERT INTO CIMR.R_CVCI_BOARD_TRACE_INFO_T(
            PLANT_CODE,
            LINE_NAME,
            LINE_SIDE,
            MOUNT_SIDE,
            MACHINE_NAME,
            STAGE_NO,
            LANE_NO,
            TABLE_NO,
            SLOT_NO,
            SUB_SLOT_NO,
            BOARDNUMBER,
            WIP_SN,
            PROGRAM_NAME,
            PATTERN_NO,
            MATERIAL_ID,
            PART_NO,
            LOT_CODE,
            VENDOR_CODE,
            DATA_CODE,
            LOCATION_NO,
            LEFT_QUANTITY,
            OPERATOR_ID,
            ENTRY_TIME,
            RELEASE_TIME,
            MODEL_NAME,
            PATTERNNUMBER,
            USED_TIME,
            SCAN_TIME,
            PARENT_REEL
          )
          VALUES (
            l_header_data_list(1).plant_code,
            line_name,
            line_side,
            l_header_data_list(1).mount_side,
            l_header_data_list(1).machine_name,
            l_header_data_list(1).stage_no,
            l_header_data_list(1).lane_no,
            l_part_data_list(i).table_no,
            LPAD(l_part_data_list(i).slot_no,4,'0'),
            l_part_data_list(i).sub_slot_no,
            l_header_data_list(1).boardnumber,
            l_header_data_list(1).wip_sn,
            l_header_data_list(1).program_name,
            NVL(l_part_data_list(i).pattern_no,0),
            NVL(l_part_data_list(i).material_id,0),
            NVL(l_part_data_list(i).part_no,0),
            NVL(l_part_data_list(i).lot_code,0),
            NVL(l_part_data_list(i).vendor_code,0),
            NVL(l_part_data_list(i).data_code,0),
            NVL(l_part_data_list(i).location_no,0),
            NVL(l_part_data_list(i).left_quantity,0),
            NVL(l_part_data_list(i).operator_id,0),
            CAST(to_timestamp_tz(l_header_data_list(1).entry_time,'MM/DD/YYYY HH24:MI:SS TZD') AS DATE),
            CAST(to_timestamp_tz(l_header_data_list(1).release_time,'MM/DD/YYYY HH24:MI:SS TZD') AS DATE),
            SUBSTR(l_header_data_list(1).model_name,0,15),
            NVL(l_part_data_list(i).pattern_no,0),
            CAST(to_timestamp_tz(l_part_data_list(i).used_time,'YYYY/MM/DD HH24:MI:SS TZD') AS DATE),
            CAST(to_timestamp_tz(l_part_data_list(i).scan_time,'YYYY/MM/DD HH24:MI:SS TZD') AS DATE),
            l_part_data_list(i).parents_material_id
          );
          insert_PlacementCount := insert_PlacementCount + 1;
        END IF;
      END LOOP;
    END IF;
  DBMS_OUTPUT.PUT_LINE('End__ Insertion Table:TRACE_INFO ID:' || PCBBarcode || ' Mc:'|| MachineName ||' Stage:' || stage_no || ' PlacementCount:' || insert_PlacementCount);
END;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值