自己编写存储过程对Oracle中的序列进行重置
2009-03-05 12:42
260 查看
SQL Server和Oracle数据库在设置表的主键的时候有一个很重要的区别,SQL Server可以通过自带的自增数据类型设置一个表的主键,而Oracle则必须借助于数据库中的序列实现自增的数据类型,这两种方式有以下几种区别:
同时 ,它们之间有一个共同的特点,那就是值只能向下递增,不能向上递减。不过,由于Oracle中的序列是独立于表字段而存在的数据库对象,所以,我们可以单独对它进行设置,如将它的当前值递减,或将值设置为初始状态。值得说明的是,在我们重置序列的值之前,需要确定该序列是否正在被数据库中的其它对象使用,否则会导致正在使用该序列的数据库对象的值混乱。
下面是用于重置Oracle序列的存储过程的代码:
Create or Replace Procedure seq_Reset(v_seqname vatchar2) As n number(10);
2tsql varchar2(100);
3Begin
4 tsql := 'Select ' || v_sqlname || '.nextval From dual';
5 Execute Immediate tsql into n;
6
7 --如果序列本身是初始状态则不进行数值计算
8 if n <> 1 then
9 n := -(n-1);
10 end if;
11
12 tsql := 'Alter Sequence ' || v_seqname || ' Increment By ' || n;
13 Execute Immediate tsql;
14 tsql := 'Select ' || v_seqname || '.nextval From dual';
15 Execute Immediate tsql into n;
16 tsql := 'Alter Sequence ' || v_seqname || ' Increment By 1';
17 Execute Immediate tsql;
18End seq_Reset;
19
20
例如你有一个名称为seq_Instance的序列,你可以直接调用该存储过程对这个序列进行重置:
Call seq_Reset('seq_Instance')
SQL Server | Oracle |
自增列隶属于它所在的表对象。 | 序列和字段分别为不同的数据库对象,它们之间没有直接的联系。 |
自增列由DB自动管理,无需手动指定值。 | 通过[序列名称].nextval命令将序列的当前值递增。 |
每个表只能允许设置一个自增列。 | 同一个序列可以被多个表使用,但同一时刻序列的当前值只能被应用到一个表中。 |
下面是用于重置Oracle序列的存储过程的代码:
Create or Replace Procedure seq_Reset(v_seqname vatchar2) As n number(10);
2tsql varchar2(100);
3Begin
4 tsql := 'Select ' || v_sqlname || '.nextval From dual';
5 Execute Immediate tsql into n;
6
7 --如果序列本身是初始状态则不进行数值计算
8 if n <> 1 then
9 n := -(n-1);
10 end if;
11
12 tsql := 'Alter Sequence ' || v_seqname || ' Increment By ' || n;
13 Execute Immediate tsql;
14 tsql := 'Select ' || v_seqname || '.nextval From dual';
15 Execute Immediate tsql into n;
16 tsql := 'Alter Sequence ' || v_seqname || ' Increment By 1';
17 Execute Immediate tsql;
18End seq_Reset;
19
20
例如你有一个名称为seq_Instance的序列,你可以直接调用该存储过程对这个序列进行重置:
Call seq_Reset('seq_Instance')
相关文章推荐
- oracle 创建表,序列,索引,视图,触发器,函数,存储过程,定时器,包体
- Oracle SQL Developer中进行存储过程调试
- 编写一个存储过程,根据学号、课程号 按成绩的20%进行加分,如果增加后的分数大于100,则取消加分。同时在存储过程中返回增加后的成绩。
- 序列定时重置时,存储过程中涉及到DDL语句,执行报错:无法执行作业1
- 使用游标编写的存储过程进行分页
- 批量修改Oracle序列值的存储过程
- oracle编写 函数和存储过程
- oracle笔记——第七天:oracle视图、触发器,编写分页存储过程
- oracle中Job定期执行存储过程刷新物化视图并记录异常(我的物化视图不能自己刷)
- Oracle 存储过程删除和新增序列解决流水号每天重新开始
- oracle存储过程基本结构的编写与plsql测试执行
- Oracle SQL Developer中进行存储过程调试
- Oracle 存储过程的导出导入序列的导出
- 用java代码编写Oracle存储过程
- Oracle存储过程编写及调用一例
- oracle 存储过程中查询序列值并用变量接收
- 在命令窗口下编写Oracle存储过程并执行的简单例子
- Oracle编写带数组参数的存储过程
- 在ORACLE下编写性能好的存储过程的一些经验
- Oracle 编写存储过程,在pl/sql中调用编写好的存储过程例子