繁体   English   中英

在Oracle SQL中使用触发器和序列的特定序列

[英]Specific Sequence using Trigger & Sequence in Oracle SQL

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

这是我触发“ 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; 

这是我的“序列”字段的序列。

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; 

但是现在的要求是从“名称”字段的第一个字母开始序列。 例如:如果名称为“ User1”,则序列应为“ U00001” ,如果名称为“ Random1”,则序列应为“ R00001”

我不知道如何实现他的功能。 救命!!!。

您可以使用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;

PS不使用不推荐使用的数据类型CHAR ,而是将VARCHAR2用于所有字符串类型的列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM