在 Oracle 中使用触发器和序列的特定序列 SQL
Specific Sequence using Trigger & Sequence in Oracle SQL
我有一个 SQL Table,我为此编写了触发器和序列,每次都会在列中插入 'I'、'U'、'D'一条记录被插入、删除或更新。
每次在 table 中插入新记录时,我还需要一个序列,所以我为此使用了一个序列。
CREATE TABLE "USER_DETAILS"
(
"ID" NUMBER(10,0) GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
"NAME" VARCHAR2(50 BYTE),
"CONTACT" NUMBER(10,0),
"STATUS" CHAR(1),
SEQUENCE VARCHAR2(50)
);
我的输出是这样的,序号按照我写的顺序从A00001开始。
ID NAME CONTACT STATUS SEQUENCE
1 USER1 123456789 I A00001
2 USER2 123456789 I A00002
这是我 "STATUS"
的触发器
create or replace trigger insert_trigger before insert on USER_DETAILS for each row
begin
insert into USER_DETAILS
(ID,NAME,CONTACT,STATUS, SEQUENCE)
values
(:new.id,:new.name,:new.contact,'I',NULL);
end;
这是我在 "Sequence" 字段中的序列。
create or replace trigger insert_trigger before insert on USER_DETAILS for each row
begin
:new.SEQUENCE := 'A'||to_char(REF_SEQUENCE.nextval,'FM00000');
end;
但现在的要求是从字段的第一个字母开始序列 "Name"。
例如:如果名称是 "User1" 那么序列应该是 "U00001"
,如果名称是 "Random1" 那么序列应该是 "R00001"
不知道如何实现他的功能。求助!!!
您可以使用 lpad
和 substr
字符串运算符创建如下序列:
create or replace trigger insert_trigger before insert on USER_DETAILS for each row
begin
:new.SEQUENCE := substr(:new.name,1,1)||lpad(to_char(REF_SEQUENCE.nextval),5,'0');
end;
P.S。不要使用已弃用的数据类型 CHAR
,而是对所有字符串类型列使用 VARCHAR2
。
我有一个 SQL Table,我为此编写了触发器和序列,每次都会在列中插入 'I'、'U'、'D'一条记录被插入、删除或更新。 每次在 table 中插入新记录时,我还需要一个序列,所以我为此使用了一个序列。
CREATE TABLE "USER_DETAILS"
(
"ID" NUMBER(10,0) GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
"NAME" VARCHAR2(50 BYTE),
"CONTACT" NUMBER(10,0),
"STATUS" CHAR(1),
SEQUENCE VARCHAR2(50)
);
我的输出是这样的,序号按照我写的顺序从A00001开始。
ID NAME CONTACT STATUS SEQUENCE
1 USER1 123456789 I A00001
2 USER2 123456789 I A00002
这是我 "STATUS"
的触发器create or replace trigger insert_trigger before insert on USER_DETAILS for each row
begin
insert into USER_DETAILS
(ID,NAME,CONTACT,STATUS, SEQUENCE)
values
(:new.id,:new.name,:new.contact,'I',NULL);
end;
这是我在 "Sequence" 字段中的序列。
create or replace trigger insert_trigger before insert on USER_DETAILS for each row
begin
:new.SEQUENCE := 'A'||to_char(REF_SEQUENCE.nextval,'FM00000');
end;
但现在的要求是从字段的第一个字母开始序列 "Name"。 例如:如果名称是 "User1" 那么序列应该是 "U00001" ,如果名称是 "Random1" 那么序列应该是 "R00001"
不知道如何实现他的功能。求助!!!
您可以使用 lpad
和 substr
字符串运算符创建如下序列:
create or replace trigger insert_trigger before insert on USER_DETAILS for each row
begin
:new.SEQUENCE := substr(:new.name,1,1)||lpad(to_char(REF_SEQUENCE.nextval),5,'0');
end;
P.S。不要使用已弃用的数据类型 CHAR
,而是对所有字符串类型列使用 VARCHAR2
。