[Home] [Help]
TRIGGER: MGDSYS.MGD_IDENCODING_COMP_TRIGGER
Source
Description
MGD_IDENCODING_comp_trigger
BEFORE INSERT ON MGD_IDENCODING_comp_tab
FOR EACH ROW
Type
BEFORE EACH ROW
Event
INSERT
Column
When
new.comp_bitmask IS NULL OR
new.substr_pos IS NULL OR
new.substr_len IS NULL OR
new.bits_to_left IS NULL OR
new.bits_to_right IS NULL
Referencing
REFERENCING NEW AS NEW OLD AS OLD
Body
DECLARE
end_pos NUMBER;
temp_bitmask RAW(128);
max_len NUMBER;
ONE_RIGHT_BIT CONSTANT RAW(1) := hextoraw('01');
TWO_RIGHT_BITS CONSTANT RAW(1) := hextoraw('03');
THREE_RIGHT_BITS CONSTANT RAW(1) := hextoraw('07');
FOUR_RIGHT_BITS CONSTANT RAW(1) :=hextoraw('0F');
FIVE_RIGHT_BITS CONSTANT RAW(1) :=hextoraw('1F');
SIX_RIGHT_BITS CONSTANT RAW(1) :=hextoraw('3F');
SEVEN_RIGHT_BITS CONSTANT RAW(1) :=hextoraw('7F');
BEGIN
IF MOD(:new.start_bit,8) = 0
THEN
:new.substr_pos := FLOOR(:new.start_bit/8);
ELSE
:new.substr_pos := FLOOR(:new.start_bit/8)+1;
END IF;
IF MOD(:new.end_bit, 8) = 0
THEN
end_pos := FLOOR(:new.end_bit/8);
ELSE
end_pos := FLOOR(:new.end_bit/8)+1;
END IF;
:new.substr_len := end_pos - :new.substr_pos + 1;
IF MOD(:new.end_bit, 8) = 0
THEN
:new.bits_to_right := 0;
ELSE
:new.bits_to_right := 8-MOD(:new.end_bit,8);
END IF;
IF MOD(:new.start_bit, 8 ) =0
THEN
:new.bits_to_left := 7;
ELSE
:new.bits_to_left := MOD(:new.start_bit,8) -1;
END IF;
IF :new.owner IS NULL
THEN
SELECT max_code_bytelen
INTO max_len
FROM MGD_IDENCODING_type_tab
WHERE type_id = :new.type_id and
owner = sys_context('userenv', 'SESSION_USER');
ELSE
SELECT max_code_bytelen
INTO max_len
FROM MGD_IDENCODING_type_tab
WHERE type_id = :new.type_id and
owner = :new.owner;
END IF;
:new.comp_bitmask := UTL_RAW.COPIES(hextoraw('00'),max_len) ;
temp_bitmask := UTL_RAW.COPIES(hextoraw('FF'),:new.substr_len);
CASE
WHEN :new.bits_to_right =1 THEN
temp_bitmask := UTL_RAW.OVERLAY(UTL_RAW.BIT_COMPLEMENT(ONE_RIGHT_BIT),
temp_bitmask,
:new.substr_len,
1);
WHEN :new.bits_to_right=2 THEN
temp_bitmask := UTL_RAW.OVERLAY(UTL_RAW.BIT_COMPLEMENT(TWO_RIGHT_BITS),
temp_bitmask,
:new.substr_len,
1);
WHEN :new.bits_to_right=3 THEN
temp_bitmask := UTL_RAW.OVERLAY(UTL_RAW.BIT_COMPLEMENT(THREE_RIGHT_BITS),
temp_bitmask,
:new.substr_len,
1);
WHEN :new.bits_to_right=4 THEN
temp_bitmask := UTL_RAW.OVERLAY(UTL_RAW.BIT_COMPLEMENT(FOUR_RIGHT_BITS),
temp_bitmask,
:new.substr_len,
1);
WHEN :new.bits_to_right=5 THEN
temp_bitmask := UTL_RAW.OVERLAY(UTL_RAW.BIT_COMPLEMENT(FIVE_RIGHT_BITS),
temp_bitmask,
:new.substr_len,
1);
WHEN :new.bits_to_right=6 THEN
temp_bitmask := UTL_RAW.OVERLAY(UTL_RAW.BIT_COMPLEMENT(SIX_RIGHT_BITS),
temp_bitmask,
:new.substr_len,
1);
WHEN :new.bits_to_right=7 THEN
temp_bitmask := UTL_RAW.OVERLAY(UTL_RAW.BIT_COMPLEMENT(SEVEN_RIGHT_BITS),
temp_bitmask,
:new.substr_len,
1);
ELSE NULL;
END CASE;
CASE
WHEN :new.bits_to_left =1 THEN
temp_bitmask := UTL_RAW.OVERLAY(
UTL_RAW.BIT_AND(SEVEN_RIGHT_BITS,UTL_RAW.SUBSTR(temp_bitmask,1,1)),
temp_bitmask,
1,
1
);
WHEN :new.bits_to_left=2 THEN
temp_bitmask := UTL_RAW.OVERLAY(
UTL_RAW.BIT_AND(SIX_RIGHT_BITS,UTL_RAW.SUBSTR(temp_bitmask,1,1)),
temp_bitmask,
1,
1
);
WHEN :new.bits_to_left=3 THEN
temp_bitmask := UTL_RAW.OVERLAY(
UTL_RAW.BIT_AND(FIVE_RIGHT_BITS,UTL_RAW.SUBSTR(temp_bitmask,1,1)),
temp_bitmask,
1,
1
);
WHEN :new.bits_to_left=4 THEN
temp_bitmask := UTL_RAW.OVERLAY(
UTL_RAW.BIT_AND(FOUR_RIGHT_BITS,UTL_RAW.SUBSTR(temp_bitmask,1,1)),
temp_bitmask,
1,
1
);
WHEN :new.bits_to_left=5 THEN
temp_bitmask := UTL_RAW.OVERLAY(
UTL_RAW.BIT_AND(THREE_RIGHT_BITS,UTL_RAW.SUBSTR(temp_bitmask,1,1)),
temp_bitmask,
1,
1
);
WHEN :new.bits_to_left=6 THEN
temp_bitmask := UTL_RAW.OVERLAY(
UTL_RAW.BIT_AND(TWO_RIGHT_BITS,UTL_RAW.SUBSTR(temp_bitmask,1,1)),
temp_bitmask,
1,
1
);
WHEN :new.bits_to_left=7 THEN
temp_bitmask := UTL_RAW.OVERLAY(
UTL_RAW.BIT_AND(ONE_RIGHT_BIT,UTL_RAW.SUBSTR(temp_bitmask,1,1)),
temp_bitmask,
1,
1
);
ELSE NULL;
END CASE;
:new.comp_bitmask := UTL_RAW.OVERLAY(temp_bitmask,:new.comp_bitmask,:new.substr_pos,:new.substr_len);
END;