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;