自动插入id的plsql触发器';s

自动插入id的plsql触发器';s,plsql,triggers,insert,Plsql,Triggers,Insert,因此,我是PL-SQL的一名noob,目前正在努力学习。在阅读有关触发器的文章时,我突然想到一个问题:是否可以在插入之前使用触发器来填充插入的一列 例如,以经典的employee表为例。假设有人调用INSERT并传递所有列的值。这意味着它们为员工id提供了一个值。是否可能有一个触发器,它将忽略用户作为员工id输入的内容,而插入下一个增量id? 也就是说,如果有人输入了202的ID,但最后给出的ID是173,则触发器会将给定的ID更改为174 我来自一个半强大的编程背景,但我不确定如何更改用户给定

因此,我是PL-SQL的一名noob,目前正在努力学习。在阅读有关触发器的文章时,我突然想到一个问题:是否可以在插入之前使用触发器来填充插入的一列

例如,以经典的employee表为例。假设有人调用INSERT并传递所有列的值。这意味着它们为员工id提供了一个值。是否可能有一个触发器,它将忽略用户作为员工id输入的内容,而插入下一个增量id? 也就是说,如果有人输入了202的ID,但最后给出的ID是173,则触发器会将给定的ID更改为174

我来自一个半强大的编程背景,但我不确定如何更改用户给定员工id的值,因为我们没有显式地将其作为参数传递

对不起,如果这是一个乞丐的问题,但我还没有找到一个谷歌的答案

使用自动递增的PL/SQL触发器维护唯一键 我使用了流行的Oracle默认表“emp”。它以前曾在较旧的数据库版本中以演示表的形式出现

您可以通过一个简单的PL/SQL触发器和一个Oracle序列对象来完成这项任务。我在自己的表格设计中为自己剪切和粘贴的示例如下所示:

CREATE SEQUENCE   "EMP_SEQ"  MINVALUE 1 MAXVALUE 9999999999999999999999999999 
   INCREMENT BY 1 START WITH 8000 CACHE 20 NOORDER  NOCYCLE
/

CREATE OR REPLACE TRIGGER  "EMP_TRG1" 
          before insert on emp
          for each row
          begin
              if :new.empno is null then
                  select emp_seq.nextval into :new.empno from dual;
             end if;
          end;
/
ALTER TRIGGER  "EMP_TRG1" ENABLE
/
对于PL/SQL的新手来说。。。上面代码中引用的第一个模式对象是Oracle PL/SQL
SEQUENCE
对象

Oracle PL/SQL序列对象 开发人员通常依靠这些来保持他们的理智,因为它是唯一性的看门人。无论请求来自何处,或者同时对该对象进行了多少次调用,它都将只发出一次序列值。创建后请尝试:

SELECT emp_seq.nextval FROM DUAL;
这里有一些样式选择,因为Oracle 11gR2和更高版本已经发布了编码语法中的一些原始限制

不需要通过使用
选择到…
来分配新的序列值。Oracle 11g允许直接分配序列值,例如:

v_somevar:= emp_seq.nextval;
将其与触发器操作耦合是可选的,但它可以让您完成自动分配字段值的完整任务

使用Oracle PL/SQL触发器分配唯一排序的ID 在没有触发器的情况下运行的
INSERT
命令如下所示:

INSERT INTO emp(empno, ename, job, mgr...)
SELECT emp_seq.nextval, 'XAVIER', 'ANALYST', ...
  FROM dual;

COMMIT;
如果依赖触发器,则可以跳过
empno
值,以获得自动分配的序列id

INSERT INTO emp(ename, job, mgr,...)
VALUES ('XAVIER', 'ANALYST', ... );

COMMIT;
或者…

INSERT INTO emp(empno, ename, job, mgr, ...)
VALUES (null, 'XAVIER', 'ANALYST', ...);

COMMIT;
在insert命令中不提及列值与为其指定空值相同。这就是触发器中包含的IF-THEN-ELSE块的含义

原始请求:

为了完成OP的功能,您需要重新排列条件块来考虑一个真正的输入值,该值被分配给主键,<代码> EMPNO./COD>由表中发布的<代码> INSER/<代码>语句。

PL/SQL触发器编码中的一些内置约定(在插入触发器之前): 使用在执行insert命令之前执行的代码是正确的选择。这意味着,管理自动递增序列分配时需要的是a

触发代码中需要密切注意的值是分配给之前之后触发状态的值,标记为
。前缀“冒号”(“:”)是语法所必需的

触发器引用的表中的每一列都可以用
:NEW
:OLD
符号作为前缀,如:
:NEW.empno
:NEW.ename
中所示


如果在INSERT触发器之前有
,则不存在
:旧的
值。(请参见链接的引用,或自行搜索)。它们(
:旧的
值)不应被引用或分配<代码>:新的
表示在
INSERT
语句中分配的值,在执行INSERT之前可以在触发器中进一步更改这些值。

这可能已经是有关SO的主题,但如果不知道术语,可能很难找到这些值。我已经发布了我自己多年来作为Oracle数据库开发人员使用的方法。。。