使用Trigger& amp;的特定序列Oracle SQL中的序列

时间:2018-03-15 04:13:52

标签: sql oracle function sequence database-trigger

我有一个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”

我不知道如何实现他的功能。帮助!!!

1 个答案:

答案 0 :(得分:2)

您可以使用lpadsubstr字符串运算符创建如下所示的序列:

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用于所有字符串类型列。