сплит операция в оракуле - PullRequest
0 голосов
/ 21 мая 2018

В основном я получаю код TRIGGER, как показано ниже.

dbms_metadata.get_ddl('TRIGGER', 'trigger_name');

Вывод вышеуказанной строки выглядит примерно так:

CREATE OR REPLACE EDITIONABLE TRIGGER "owner"."trigger_name" BEFORE DELETE ON roles FOR EACH ROW
BEGIN
DBMS_APPLICATION_INFO.read_client_info (acct_utils.trigger_enabled);
IF acct_utils.trigger_enabled <> 'F' THEN
  INSERT INTO qatable (ID,KEY, OBJECT, KEYTYPE, TYPE, OBJ_DEF_ID, WHENCREATED, WHENDELETED, DELETEDBY) VALUES(
    :old.cny#,
    :old.record#,
    'roles',
    null,
    :old.name,
    null,
    :old.whencreated,
    (CURRENT_TIMESTAMP AT TIME ZONE 'GMT'),
    SYS_CONTEXT('TMCtx', 'USERKEY')
  );
END IF;
END trigger_name;
ALTER TRIGGER "owner"."trigger_name" ENABLE

Я пытаюсь получить только вставку в qatable"оператор, использующий следующий оператор

select substr(dbms_metadata.get_ddl('TRIGGER', 'trigger_name'), 
    instr(upper(dbms_metadata.get_ddl('TRIGGER', 'trigger_name')), 'INSERT INTO qatable ('),
    instr(dbms_metadata.get_ddl('TRIGGER', 'trigger_name'), ';', instr(upper(dbms_metadata.get_ddl('TRIGGER', 'trigger_name')), 'INSERT INTO qatable'), 1) -
          instr(upper(dbms_metadata.get_ddl('TRIGGER', 'trigger_name')), 'INSERT INTO qatable') + 1) from dual;

Результатом вышеупомянутого запроса является оператор вставки либо

INSERT INTO qatable (ID,KEY, OBJECT, KEYTYPE, TYPE, OBJ_DEF_ID, WHENCREATED, WHENDELETED, DELETEDBY) VALUES(
    :old.ID,
    :old.KEY,
    'roles',
    null,
    :old.type,
    null,
    :old.whencreated,
    (CURRENT_TIMESTAMP AT TIME ZONE 'GMT'),
    SYS_CONTEXT('TMCtx', 'USERKEY')
  );

ИЛИ

  INSERT INTO qatable (ID,KEY, KEYTYPE, TYPE, OBJ_DEF_ID, WHENCREATED, WHENDELETED, DELETEDBY) VALUES(
    :old.ID,
    :old.KEY,
    null,
    :old.type,
    null,
    :old.whencreated,
    (CURRENT_TIMESTAMP AT TIME ZONE 'GMT'),
    SYS_CONTEXT('TMCtx', 'USERKEY')
  );

в зависимости от имени триггера.

Для немногих триггеров значение в поле TYPE равно нулю, а для других значение получает проходы.У меня есть требование, например, если какое-либо значение вставляется в 'Type', я должен сохранить его в массиве или списке и отправить обратно через процедуру.

desc qatable;дает следующий результат

Name            Null?       Type         
-----------     --------    ------------ 
ID              NOT NULL     NUMBER(15)   
KEY             NOT NULL     NUMBER(15)   
OBJECT          NOT NULL     VARCHAR2(30) 
KEYTYPE                      CHAR(2)      
TYPE                         VARCHAR2(60) 
OBJ_DEF_ID                   NUMBER(8)    
WHENDELETED                  DATE         
DELETEDBY                    NUMBER(8)    
WHENCREATED                  DATE         
RECORDNO        NOT NULL     NUMBER
...