2010-06-30 2 views
2

У меня есть следующая таблица со значением 501 в нем ..SQL хранит proc - помогите мне написать это, пожалуйста! (Часть 2)

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

Как я могу написать хранимую процедуру на этом, который возвращает меня 501 и увеличивает номер к следующему в последовательности (т.е. 502) ? Я бы хотел, чтобы это поведение повторялось каждый раз при вызове хранимой процедуры proc.

(Кроме того, как я могу назвать это ХП из любого запроса?)

Часть моего предыдущего вопроса 3151056.

Спасибо,

Voodoo

ответ

1
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; 
+0

Я предположил, что таблица _NUMBERS содержит только одну значительную запись и что у нас нет проблем параллелизма (то есть одновременное чтение и т. Д.). – UltraCommit

+1

@Chicken :) -> не с этой таблицей мы не будем иметь проблемы параллелизма. Но что произойдет, если будут одновременные чтения? Будет ли db-сессия не заблокирована нитью, а другой поток просто ждет ее? (sry, если это вопрос типа noob) – VoodooChild

+1

В течение одной микросекунды два пользователя могут считывать (и производить на выходе) одно и то же значение, увеличивая поле NUMBER два раза. – UltraCommit

3

Используйте столбец IDENTITY, который заботится о нумерации и приращения для вас.

Любой возвращаемый номер подлежит уже используется другим соединением/клиента/процесса

+1

Я не думаю, что я мог бы использовать IDENTITY в моем случае, потому что я перемещаю данные из тихих нескольких старых таблиц, некоторые из которых используют этот номер, и некоторые из них являются NULL. посмотрите мой предыдущий вопрос, чтобы узнать, что я хотел сделать http://stackoverflow.com/questions/3151056/sql-stored-proc-help-me-write-this-one-please - Спасибо за ваш ответ – VoodooChild

2

Вы Импорт данных из старых таблиц, верно? Что делать, если вы импортируете данные из старых таблиц с идентификацией, и после этого вы устанавливаете идентификатор с наивысшим номером + 1 и продолжаете свою жизнь, используя личность.

Другой подход заключается в использовании триггера вставки, который будет проверять, является ли NumberItem нулевым, и он добавит Max + 1, если он равен нулю. Если нет, ничего не делайте.

Я не думаю, что SP является хорошим решением. И я уверен, что вам не нужны все это.

Смежные вопросы