自动插入id的plsql触发器';s
因此,我是PL-SQL的一名noob,目前正在努力学习。在阅读有关触发器的文章时,我突然想到一个问题:是否可以在插入之前使用触发器来填充插入的一列 例如,以经典的employee表为例。假设有人调用INSERT并传递所有列的值。这意味着它们为员工id提供了一个值。是否可能有一个触发器,它将忽略用户作为员工id输入的内容,而插入下一个增量id? 也就是说,如果有人输入了202的ID,但最后给出的ID是173,则触发器会将给定的ID更改为174 我来自一个半强大的编程背景,但我不确定如何更改用户给定员工id的值,因为我们没有显式地将其作为参数传递 对不起,如果这是一个乞丐的问题,但我还没有找到一个谷歌的答案 使用自动递增的PL/SQL触发器维护唯一键 我使用了流行的Oracle默认表“emp”。它以前曾在较旧的数据库版本中以演示表的形式出现 您可以通过一个简单的PL/SQL触发器和一个Oracle序列对象来完成这项任务。我在自己的表格设计中为自己剪切和粘贴的示例如下所示:自动插入id的plsql触发器';s,plsql,triggers,insert,Plsql,Triggers,Insert,因此,我是PL-SQL的一名noob,目前正在努力学习。在阅读有关触发器的文章时,我突然想到一个问题:是否可以在插入之前使用触发器来填充插入的一列 例如,以经典的employee表为例。假设有人调用INSERT并传递所有列的值。这意味着它们为员工id提供了一个值。是否可能有一个触发器,它将忽略用户作为员工id输入的内容,而插入下一个增量id? 也就是说,如果有人输入了202的ID,但最后给出的ID是173,则触发器会将给定的ID更改为174 我来自一个半强大的编程背景,但我不确定如何更改用户给定
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/SQLSEQUENCE
对象
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数据库开发人员使用的方法。。。