Повторяемая вставка строки в таблицу в Oracle SQL - PullRequest
0 голосов
/ 01 июня 2018

Я хочу иметь скрипт, который можно запускать несколько раз, без добавления строки в состояние базы данных после первого раза.Он должен вставить строку с двумя столбцами в таблицу KPI_TYPE, столбцами будут KPI_TYPE_ID и NAME, и было бы неплохо, если бы он обновил последовательность KPI_TYPE_SEQ, но только при первом запуске.

Что я получил первымИдея такова:

merge into KPI_TYPE dest
using (select 26 as KPI_TYPE_ID, 'Web Service Availability' as NAME from dual) src
on (src.KPI_TYPE_ID = dest.KPI_TYPE_ID)
when matched then update set 
  dest.NAME    = src.NAME
when not matched then 
  insert (KPI_TYPE_ID, NAME)
  values (src.KPI_TYPE_ID, src.NAME);

Это дает почти то, что я хочу, но не обновляет последовательность.Также было бы неплохо, если бы обновление последовательности происходило только при значении 26. Было бы хорошо, если бы это произошло во второй команде SQL.

Существует также триггер, присоединяющий последовательность к таблице:

create or replace TRIGGER "SCHEMA"."B1_KPI_TYPE" 
  BEFORE INSERT ON KPI_TYPE
  FOR EACH ROW
DECLARE
BEGIN
  IF( :new.KPI_TYPE_ID IS NULL )
  THEN
    :new.KPI_TYPE_ID := KPI_TYPE_SEQ.nextval;
  END IF;
END;

Пример данных до:

11  DB Connectivity
12  DB Health Check
13  SOAP Service Availability
14  FTP/SFTP Server Availability
18  Queue Check
19  Business Check
20  Engine Availability
21  Backlog Management
23  Composite KPI
24  DB Objects Check
25  SMSC Gateway Availability

Последовательность до:

CREATED 01.06.18
LAST_DDL_TIME   01.06.18
SEQUENCE_OWNER  SCHEMA
SEQUENCE_NAME   KPI_TYPE_SEQ
MIN_VALUE   1
MAX_VALUE   9999999999999999999999999999
INCREMENT_BY    1
CYCLE_FLAG  N
ORDER_FLAG  N
CACHE_SIZE  0
LAST_NUMBER 26

После первого запуска сценария:

11  DB Connectivity
12  DB Health Check
13  SOAP Service Availability
14  FTP/SFTP Server Availability
18  Queue Check
19  Business Check
20  Engine Availability
21  Backlog Management
23  Composite KPI
24  DB Objects Check
25  SMSC Gateway Availability
26  Web Service Availability

Последовательность после первого запуска:

CREATED 01.06.18
LAST_DDL_TIME   01.06.18
SEQUENCE_OWNER  SCHEMA
SEQUENCE_NAME   KPI_TYPE_SEQ
MIN_VALUE   1
MAX_VALUE   9999999999999999999999999999
INCREMENT_BY    1
CYCLE_FLAG  N
ORDER_FLAG  N
CACHE_SIZE  0
LAST_NUMBER 27

После второго запуска сценария:

11  DB Connectivity
12  DB Health Check
13  SOAP Service Availability
14  FTP/SFTP Server Availability
18  Queue Check
19  Business Check
20  Engine Availability
21  Backlog Management
23  Composite KPI
24  DB Objects Check
25  SMSC Gateway Availability
26  Web Service Availability (It is also ok if this gets updated to 26 New Name)

Последовательность после второго запуска:

CREATED 01.06.18
LAST_DDL_TIME   01.06.18
SEQUENCE_OWNER  SCHEMA
SEQUENCE_NAME   KPI_TYPE_SEQ
MIN_VALUE   1
MAX_VALUE   9999999999999999999999999999
INCREMENT_BY    1
CYCLE_FLAG  N
ORDER_FLAG  N
CACHE_SIZE  0
LAST_NUMBER 27

Я пытаюсьэто сейчас:

declare v_seqvariable number;
begin
    SELECT last_number INTO v_seqvariable 
      FROM all_sequences
     WHERE sequence_owner = 'SCHEMA'
       AND sequence_name = 'KPI_TYPE_SEQ';    

    if v_seqvariable = 26 then DBMS_OUTPUT.put_line('Is 26'); else DBMS_OUTPUT.put_line('Is not 26'); end if;
end;

Однако я не получаю никакого вывода.Должен ли я его промыть или что-то еще?

1 Ответ

0 голосов
/ 01 июня 2018

Следующий код выполняет с последовательностью то, что я хочу:

SET SERVEROUTPUT ON;
declare 
v_seqvariable number;
v_result number;
begin
    SELECT last_number INTO v_seqvariable 
      FROM all_sequences
     WHERE sequence_owner = 'SCHEMA'
       AND sequence_name = 'KPI_TYPE_SEQ';    

    if v_seqvariable = 26 then DBMS_OUTPUT.put_line('Is 26'); select SCHEMA.KPI_TYPE_SEQ.nextval INTO v_result FROM DUAL; else DBMS_OUTPUT.put_line('Is not 26'); end if;
end;

Вывод:

anonymer Block abgeschlossen
Is 26

anonymer Block abgeschlossen
Is not 26

Теперь осталось только проверить код MERGE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...