当前位置: 首页 > 面试题库 >

如何在Oracle 10g中每年自动将序列的值重置为0?

刘翔宇
2023-03-14
问题内容

就像在问题中一样,如何在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;
    /

笔记:

  • 重命名序列时,如何最好地保护序列以防访问?
  • 这里有几个测试用例。
  • 第一遍,检查正数,递增,递增1序列的规范情况。
  • 更好的方法是创建新的SEQUENCE,添加权限,重命名现有序列和新序列,然后重新编译依赖项吗?


 类似资料:
  • 问题内容: 我们正在创建现有数据库的“空白” /最小副本,并希望将序列之一重置为值。将数字放在下面的作品中,但是当导出中的序列具有更高的数字时,我想使其可重用,从而尝试避免删除和重新创建。 您是否可以执行子选择和计算的等效操作来获取值,还是需要将其设置为变量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语句。 这将自动重置价值,以该字段的值(在概念是不正确的,