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楼的代码后,惊奇的发现不报错了,就是这么奇葩,请恕我暂时还没能理解,开始怀疑师兄的插入程序有毒。

时间: 2025-01-04 01:02:19

Oracle中序列及触发器使用的相关文章

Oracle中序列的操作以及使用前对序列的初始化

Oracle中序列的操作以及使用前对序列的初始化 一 创建序列 create sequence myseq start with 1 increment by 1 nomaxvalue minvalue 1 二 初始化序列 select myseq.nextval from dual; 这里值得注意的是,如果先直接写select myseq.currval from dual,会提示会提示myseq.currtval尚未在此会话中定义. www.2cto.com 三 使用序列 初始化序列之后才可

Oracle中用序列和触发器实现ID自增

在设计数据库的时候,Oracle中没有类似SQL Server中系统自动分配ID作为主键的功能,这时Oracle可以通过"序列"和"触发器"来实现ID自动增加的功能. 1.创建序列Sequence create sequence seq_uid increment by 1 start with 1 nomaxvalue nocycle cache 10 ; 其中:"seq_uid"表示自定义的序列名称: "start with 1&q

Oracle 数据库中序列结合触发器实现主键自增长

一.数据表名称为T_OFFICE,其主键为PID(number类型) 二.首先为数据表的PID字段创建序列 序列名称:S_T_OFFICE_PID 序列详细内容: 三.创建相应的触发器 触发器名称:T_OFFICETRIGER 触发器具体内容: create or replace TRIGGERHYMGS_INDUSTRY_FQ6.T_OFFICETRIGER BEFORE INSERT ON HYMGS_INDUSTRY_FQ6.T_OFFICE FOR EACH ROW BEGINselec

oracle中自增长触发器

create sequence processss minvalue 1 maxvalue 999999999999 start with 31 increment by 1 ; create or replace trigger trg_t_process_config before insert on t_process_config for each row declare begin select processss.nextval into:new.id from dual; end

Oracle - 使用序列+触发器实现主键自增长

Oracle中的自增,不如Sql server那般方便. 1 --1.创建序列 2 CREATE SEQUENCE "TABLE_NAME"."SQ_NAME" 3 MINVALUE 1 MAXVALUE 9999999999999999999999999999 4 -- 定义列的步长,默认为1 5 INCREMENT BY 1 6 -- 定义序列的起始值,默认为1 7 START WITH 1 8 CACHE 20 NOORDER NOCYCLE ; 9 --2.

Oracle中触发器(1)

Oracle数据库触发器是存储于数据库的命名PL/SQL语句块,当触发事件发生时他们会隐含的执行,执行触发器的活动被称为触发触发器. 特定用户在特定模式下,或者任何用户执行的ddl语句(如create或者alter),这种触发器经常被用于审计目的,并且专用于oracle DBA.可以记录各种模式修改,何时执行.以及那个用户执行的. 系统事件,如数据库启动或者关闭 用户事件,如登录或者注销.即可以定义一个触发器,在用户登录数据库时记录用户名和登录时间. 触发器相关视图: 创建触发器的通用语法: c

Oracle中创建自增字段(序列sequence)方法

oracle没有ORACLE自增字段这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现. 下面给大家讲个例子: 1.在Oracle中创建一个表: 1.创建一个表 create table t_client (id number(4) primary key, pid number(4) not null, name varchar2(30) not null, client_id varchar2(10), client_level char(3), bank_acc

oracle 主键应用序列和触发器实现自动增长

oracle 主键自动增长 这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create table simon_example ( id number(4) not null primary key, name varchar2(25) ) -- 建立序列: -- Create sequence create sequence SIMON_SEQUENCE minvalue 1 maxvalue 999999999999999999999999999 start with 1

ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者其他. 1.创建序列 Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE 权限 CREATE SEQUENCE CUX_DEMO_SEQUENCEMINVALUE 1MAXVALUE 99999999999START WITH 1000