DBA Data[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;