Oracle中序列及触发器使用
总结一下这次使用的序列和触发器,也把相应的一些操作用了一下。遇到的问题比较奇葩,仅供参考。
一、序列部分(网上的)
1、建立序列SEQUENCE
create sequence user_seq increment by 1 start with 1 minvalue 1 maxvalue 9999999999999 nocache order;
语法:
CREATE SEQUENCE s_id NOMAXVALUE NOCYCLE
--INCREMENT BY 1 -- 每次加几个
--START WITH 1 -- 从1开始计数
--NOMAXVALUE -- 不设置最大值
--NOCYCLE -- 一直累加,不循环
--CACHE 10; -- 缓存序列个数,有助于提高效率,但可能造成跳号
如:create sequence sequenceName increment by 1 start with 1 minvalue 1 nomaxvalue nocycle;
2、查询序列号
必须以管理员身份登录; 这个感觉没必要
sequence_owner必须为大写,不管你的用户名是否大写。只有大写才能识别。用户名区分大小写是真的
--查看当前用户的所有序列
select SEQUENCE_OWNER,SEQUENCE_NAME from dba_sequences where sequence_owner='用户名';
--查询当前用户的序列总数
select count(*) from dba_sequences where sequence_owner='用户名';
3、得到序列的SQL语句
select seq_newsid.nextval from sys.dual;
4、删除序列的SQL
DROP SEQUENCE seq_newsId;
二、触发器部分(网上的)
1、创建触发器
创建一个基于该表的before insert 触发器,在触发器中使用刚创建的SEQUENCE。
复制代码代码如下:
create or replace trigger user_trigger
before insert on user
for each row
begin
select user_seq.nextval into:new.id from sys.dual ;
end user_trigger ;
2、查all_triggers表得到trigger_name
select trigger_name from all_triggers where table_name='XXX';
3、根据trigger_name查询出触发器详细信息
select text from all_source where type='TRIGGER' AND name='TR_XXX';
4、删除触发器
DROP TRIGGER trigger_name;
三、全过程(网上的)
1、建立表
复制代码代码如下:
create table user
(
id number(6) not null,
name varchar2(30) not null primary key
)
2、建立序列SEQUENCE
复制代码代码如下:
create sequence user_seq increment by 1 start with 1 minvalue 1 maxvalue 9999999999999 nocache order;
语法:
CREATE SEQUENCE s_id NOMAXVALUE NOCYCLE
--INCREMENT BY 1 -- 每次加几个
--START WITH 1 -- 从1开始计数
--NOMAXVALUE -- 不设置最大值
--NOCYCLE -- 一直累加,不循环
--CACHE 10; -- 缓存序列个数,有助于提高效率,但可能造成跳号
3、创建触发器
创建一个基于该表的before insert 触发器,在触发器中使用刚创建的SEQUENCE。
复制代码代码如下:
create or replace trigger user_trigger
before insert on user
for each row
begin
select user_seq.nextval into:new.id from sys.dual ;
end user_trigger ;
四、实际操作(自己做的)
创建序列
create sequence SEQ_LDTJXXB increment by 1 start with 1 minvalue 1 nomaxvalue nocycle;
创建触发器
下面这段不行:
create or replace trigger trigger_ldtjxxb before insert on ldtjxxb
for each row
begin
select SEQ_LDTJXXB.nextval into:new.OBJECTID from dual;
end;
下面这段可以:
create or replace trigger trigger_ldtjxxb
--before
before insert on ldtjxxb
for each row
begin
select SEQ_LDTJXXB.nextval into :new.OBJECTID from dual;
end;
在PLSQL中运行上面那段不能满足我的需求,具体表现为在使用程序进行插入数据时,会报错,显示【触发器无效且未通过重新验证】
在百度的时候发现了这个http://bbs.csdn.net/topics/391842678,但和我的情况不一样,使用了2楼的代码后,惊奇的发现不报错了,就是这么奇葩,请恕我暂时还没能理解,开始怀疑师兄的插入程序有毒。