Я хочу иметь скрипт, который можно запускать несколько раз, без добавления строки в состояние базы данных после первого раза.Он должен вставить строку с двумя столбцами в таблицу 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;
Однако я не получаю никакого вывода.Должен ли я его промыть или что-то еще?