我有一个SQL表,我已经编写了触发器和序列,每次插入,删除或更新记录时,都会在列中插入“I”,“U”,“D”。 每次在表中插入新记录时我也需要一个序列,所以我使用了一个序列。
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
这是我对“状态”的触发器
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;
这是我的序列“序列”。
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”
我不知道如何实现他的功能。帮助!!!
答案 0 :(得分:2)
您可以使用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
用于所有字符串类型列。