就像在问题中一样,如何在Oracle 10g中每年自动将Oracle序列的值重置为0?
我正在使用序列生成格式的标识符,YYYY<sequence value>
并且每年必须将序列值重置为0。
YYYY
是从Java获得的,并与Oracle的序列值连接在一起。由于外部第三方的要求,无法更改标识符的格式。感谢您的任何帮助。
序列并不是真正要重置的设计。但是在某些情况下,需要重置序列,例如,在设置测试数据或将生产数据合并回测试环境中时。在生产中通常 不会 进行这种活动。
如果要将该类型的操作投入生产,则需要进行彻底的测试。(最令人担忧的是重置程序有可能在错误的时间(例如,年中)意外执行。
删除并重新创建序列是一种方法。作为一项操作,就SEQUENCE而言,它相当简单:
DROP SEQUENCE MY_SEQ;
CREATE SEQUENCE MY_SEQ以1递增1最小值0开始;
[编辑]正如Matthew Watson正确指出的那样,每个DDL语句(例如DROP,CREATE,ALTER)都将导致隐式提交。[/编辑]
但是,在SEQUENCE上授予的任何特权都将被删除,因此将需要重新授予这些特权。任何引用该序列的对象都将失效。为了使这个更通用,您需要保存特权(在删除序列之前),然后重新授予它们。
第二种方法是更改现有的SEQUENCE,而无需删除并重新创建它。可以通过将INCREMENT值更改为负值(当前值与0之间的差),然后精确地html" target="_blank">执行一个.NEXTVAL来将当前值设置为0,然后将INCREMENT更改回1,来完成重置序列的操作。之前(通常在测试环境中),我使用了相同的方法来将序列设置为更大的值。
当然,要使其正常工作,您需要 确保
在执行此操作时没有其他会话引用该序列。在错误的时间加上一个额外的.NEXTVAL将使复位加倍。(注意:如果应用程序以序列的所有者而不是单独的用户身份进行连接,则在数据库端实现该目标将很困难。)
为了使它每年发生,您需要安排一份工作。序列重置必须与标识符的YYYY部分的重置相协调。
[编辑]
未测试的 占位符,用于重置顺序的PL / SQL块的一种可能设计
declare
pragma autonomous_transaction;
ln_increment number;
ln_curr_val number;
ln_reset_increment number;
ln_reset_val number;
begin
-- save the current INCREMENT value for the sequence
select increment_by
into ln_increment
from user_sequences
where sequence_name = 'MY_SEQ';
-- determine the increment value required to reset the sequence
-- from the next fetched value to 0
select -1 - MY_SEQ.nextval into ln_reset_increment from dual;
-- fetch the next value (to make it the current value)
select MY_SEQ.nextval into ln_curr from dual;
-- change the increment value of the sequence to
EXECUTE IMMEDIATE 'alter sequence MY_SEQ increment by '
|| ln_reset_increment ||' minvalue 0';
-- advance the sequence to set it to 0
select MY_SEQ.nextval into ln_reset_val from dual;
-- set increment back to the previous(ly saved) value
EXECUTE IMMEDIATE 'alter sequence MY_SEQ increment by '
|| ln_increment ;
end;
/
笔记:
问题内容: 我们正在创建现有数据库的“空白” /最小副本,并希望将序列之一重置为值。将数字放在下面的作品中,但是当导出中的序列具有更高的数字时,我想使其可重用,从而尝试避免删除和重新创建。 您是否可以执行子选择和计算的等效操作来获取值,还是需要将其设置为变量1st? 目的是以nextval的序列结尾为99999。 问题答案: 您可以使用负增量将序列重置为较低的值-此脚本(仅是您的PL / SQL块
问题内容: 我需要将列转换为行并获取其平均值。 例如,我有此表: 输出应为: 我该如何实现?感谢您的帮助。 问题答案: 如果您使用的是11G,则可以使用: 但是由于您不是,所以您可以伪造它。从本网站改编: 在这两种情况下,内部结构都将行转换为列。在10克中,您只需要自己做即可。在刚刚产生虚值的列表,这必须有足够的覆盖要转换为行(如果你真的有1000,你真的应该重新审视数据模型)的列数。这两个语句使
问题内容: 在PostgreSQL中,我可以做这样的事情: 是否有Oracle等效产品? 问题答案: 这是一个很好的过程,可以将Oracle专家Tom Kyte的任何序列重置为0 。在下面的链接中也对正反两方面进行了精彩的讨论。
问题内容: 我试图弄清楚如何为给定列中的每个不同值重置mysql中的行号。最好用一个例子来解释一下: 我有一组进行客户访问的用户,每个客户可能会被访问多次,并且我的表记录了访问的日期(但不是这是第一次,第二次,第三次访问)。所以我的桌子看起来像: 我要查找的是给定日期段内进行了多少次(例如)第二次访问。因此,在上面的数据中,有3次首次访问和2次第二次访问。 我假设我需要使用类似@rownum功
我正在使用VS Code编辑多种语言(主要是Ruby、PHP和Javascript)的项目,对于每种语言,我们有不同的缩进模型(空格/制表符和宽度)。看起来VS Code支持这一点,因为它允许将和设置为,这是每种语言的定义。 但是当看起来要做我想要的事情时,在模式下总是插入空格。 我试图找到可以编辑每种语言配置的位置,但没有找到这样的设置。我还查看了下的语言目录,但未能找到指定这些功能的内容。 知
问题内容: 我正在与Spring和Hibernate一起使用Java开发Web应用程序。假设我有一张桌子。当我从该表中删除一些记录时,有时我需要重置主键字段的值。 假设我在一个表中有10条记录,而我删除了最后5条记录。现在,当我插入新记录时,主键字段的值应从开始,但应从开始。 如果需要在MySql 中的()处启动主键值,则只需执行以下SQL语句。 这将自动重置价值,以该字段的值(在概念是不正确的,