【发布时间】:2018-06-01 12:19:27
【问题描述】:
我想要一个可以多次运行的脚本,而不是在第一次之后向数据库状态添加一行。它应该在 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;
但是,我没有得到任何输出。我必须冲洗它吗?
【问题讨论】:
-
我不确定你的意思。您更新表和列,而不是序列。什么是'向数据库状态添加一行'?
-
通过更新序列我的意思是调用
sequence.nextval。但是,仅当序列的当前值为26时才应调用它。数据库状态是一个表有 10 行并添加第 11 行,但如果多次调用脚本,则不应添加更多行。 -
您能否详细解释一下该序列,您希望它更新的方式和原因?
-
类似
select kpi_type_seq.nextval from dual?这与您要更新的表有什么关系?为什么它的当前值很重要? -
该表有一个触发器用于插入 KPI_TYPE_ID 为 null 的行,然后它将使用序列中的
nextval。但是如果脚本运行两次,我不想再有一行,也不想seq.nextval增加序列。如果它返回例如不是 26 的值,我也不想增加序列