oracle触发器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle触发器相关的知识,希望对你有一定的参考价值。

--创建 快点复电--抢修车路径表
DROP TABLE KSFD_QXCLJ;
CREATE TABLE KSFD_QXCLJ(
ID NUMBER(20),
JD VARCHAR2(50),
WD VARCHAR2(50),
GEOMETRY MDSYS.SDO_GEOMETRY
);
comment on TABLE KSFD_QXCLJ IS '抢修车路径表';
comment on column KSFD_QXCLJ.ID IS '自增ID';
comment on column KSFD_QXCLJ.JD IS '经度';
comment on column KSFD_QXCLJ.WD IS '纬度';
comment on column KSFD_QXCLJ.geometry IS '仓库geometry对象信息';
--插入metadata数据
DECLARE
V_NUM NUMBER := 0;
BEGIN
SELECT COUNT(*) INTO V_NUM FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME = 'KSFD_QXCLJ' AND COLUMN_NAME = 'GEOMETRY';
IF V_NUM = 0 THEN
INSERT INTO USER_SDO_GEOM_METADATA
(TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)
VALUES
('KSFD_QXCLJ',
'GEOMETRY',
MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('X', 97, 107, 0.00000001),
MDSYS.SDO_DIM_ELEMENT('X', 21, 29, 0.00000001),
MDSYS.SDO_DIM_ELEMENT('X', 0, 8000, 0.001)),
4326);
COMMIT;
END IF;
END;
/
--创建空间索引
CREATE INDEX IDX_KSFD_QXCLJ ON KSFD_QXCLJ(GEOMETRY) INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('SDO_INDX_DIMS=2,LAYER_GTYPE=POINT');
--创建序列
DROP SEQUENCE KSFD_QXCLJ_SEQ;
CREATE SEQUENCE KSFD_QXCLJ_SEQ
MINVALUE 1
MAXVALUE 999999999999999
START WITH 1
INCREMENT BY 1
NOCACHE;

--创建触发器
DROP TRIGGER KSFD_QXCLJ_TRI;
CREATE OR REPLACE TRIGGER KSFD_QXCLJ_TRI
BEFORE INSERT ON KSFD_QXCLJ
FOR EACH ROW
BEGIN
SELECT KSFD_QXCLJ_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
/
为什么插入数据的时候id自增为2而不是1

根据你的描述自增应该为1 ,但是首次数据插入时id为2,因为你的序列初始值为1,首次插入数据时触发触发器,取得NEXTVAL 为2追问

不是首次试每次递增都是2 , 2 4 6 8 10 这样递增

参考技术A 你插入数据的代码是什么样的?追问

insert into KSFD_QXCLJ (ID, JD, WD)
values (1, 'C564268', '102.504425', '25.2069083333');

追答

晕啊,insert列表3个,values列表4个?
你既然用触发器来实现id的填充,那么insert语句中,就不应该带id列了。

获取触发 Oracle 触发器的值

【中文标题】获取触发 Oracle 触发器的值【英文标题】:Getting the value that fired the Oracle trigger 【发布时间】:2012-02-08 05:58:30 【问题描述】:

我对 Oracle 触发器非常陌生。假设我在表 emp 中插入了一个触发器。有没有办法找出触发触发器的插入记录是什么。如果插入的记录是特定值,我希望触发器具有执行某些操作的代码。

【问题讨论】:

【参考方案1】:

正在插入的行在触发器中以NEW 的形式提供

查看手册了解更多详情。

http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#BABEBAAB

http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#LNPLS99955

【讨论】:

【参考方案2】:

假设您有一个行级触发器,您可以简单地使用:NEW 伪记录

CREATE TRIGGER name_of_trigger
  BEFORE INSERT ON emp
  FOR EACH ROW
DECLARE
  <<declare variables>>
BEGIN
  IF( :new.ename = 'JUSTIN' )
  THEN
    <<do something if the newly inserted ENAME value is 'JUSTIN'>>
  END IF;
END;

对于 DDL 触发器,方法完全不同。在这种情况下,伪函数 ora_dict_obj_owner 和 ora_dict_obj_name 将返回 DDL 语句正在操作的表的所有者和名称。

【讨论】:

嘿@Justin Cave 很抱歉打扰你,但我意识到我实际上需要一个 DDL 或 SYStem 触发器而不是 DML 触发器。每次在架构CREATE OR REPLACE TRIGGER drop_trigger AFTER CREATE ON hr.SCHEMA BEGIN END; 中创建新表时,我都会调用触发器我如何获得现在触发触发器的创建表的名称?它还是新的吗? @Eosphorus - 不,DDL 触发器是非常不同的动物。更新了我的答案。 非常感谢贾斯汀。这已经是你帮助我的好几次了。我真的很感激:)

以上是关于oracle触发器的主要内容,如果未能解决你的问题,请参考以下文章

oracle登录触发器造成无法登录

oracle 创建触发器问题

oracle 触发器自治事务

oracle触发器出错

oracle 中如何删除或修改 触发器?

oracle触发器的相关问题,请教