【问题标题】:SQL stored proc - help me write this one, please! (part 2)SQL 存储过程 - 请帮我写这个! (第2部分)
【发布时间】:2011-03-10 06:08:23
【问题描述】:

我有下表,其中包含值 501..

CREATE TABLE _Numbers(
    Number numeric(20,0) NOT NULL PRIMARY KEY
)
INSERT INTO _Numbers VALUES(501)

我如何编写一个存储过程,它返回 501 并按顺序将 Number 递增到下一个(即 502)?我希望每次调用存储过程时都重复这种行为。

(另外,如何从任何查询中调用此存储过程?)

我之前的问题3151056的一部分。

谢谢,

巫毒

【问题讨论】:

    标签: sql database stored-procedures sybase


    【解决方案1】:

    您是从旧表中导入数据,对吧? 如果您从旧表中导入数据并关闭标识,然后设置具有最高数字+1 的标识并使用标识继续您的生活。

    其他方法是在插入时使用触发器,该触发器将检查 NumberItem 是否为空,如果为空,它将添加 Max+1。如果没有,什么也不做。

    我不认为 SP 是一个好的解决方案。而且我很确定您不需要所有这些东西。

    【讨论】:

      【解决方案2】:

      使用 IDENTITY 列来为您处理编号和递增。

      任何返回的号码都可能已被另一个连接/客户端/进程使用

      【讨论】:

      • 我认为我不能在我的情况下使用 IDENTITY,因为我正在从安静的几个旧表中移动数据,其中一些设置了要使用的数字,其中一些为 NULL。请参阅我之前发布的问题以了解我想做什么stackoverflow.com/questions/3151056/… - 感谢您的回答
      【解决方案3】:
      CREATE OR REPLACE PROCEDURE read_and_increment (number_just_read OUT NUMBER)
      IS
      BEGIN
         DECLARE
            stored_number   NUMBER DEFAULT NULL;
         BEGIN
            SELECT number
              INTO stored_number
              FROM _numbers
             WHERE ROWNUM = 1;
      
            number_just_read := stored_number;
      
            UPDATE _numbers
               SET number = number + 1;
      
            COMMIT;
         END;
      END read_and_increment;
      

      【讨论】:

      • 我假设 _NUMBERS 表只包含一个重要记录,并且我们没有并发问题(即同时读取等)。
      • @Chicken :) -> 没有这个表我们不会有并发问题。但是如果同时读取会发生什么?数据库会话不会被线程一锁定而另一个线程只是在等待它吗? (对不起,如果这是一个菜鸟问题)
      • 在一微秒内,两个用户可以读取(并在输出中产生)相同的值,将 NUMBER 字段增加两次。
      猜你喜欢
      • 2015-06-13
      • 2011-12-14
      • 1970-01-01
      • 2012-10-25
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多