Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Типовая процедура обновления записей в БД.




 

PL/SQL (Oracle).

1. CREATE PROCEDURE проводка

(номер1 IN NUMBER,

номер2 IN NUMBER,

сумма IN NUMBER) IS

1.a остаток NUMBER;

2. CURSOR курсор (номер_счёта_1 NUMBER,

номер_счёта_2 NUMBER) IS

SELECT номер_счёта, остаток

FROM _счёт

WHERE номер_счёта=номер_счёта_1 OR

номер_счёта=номер_счёта_2

FOR UPDATE OF остаток;

3. запись курсор%ROWTYPE;

4. BEGIN

5. OPEN курсор (номер1,

номер2);

6. LOOP

7. FETCH курсор INTO запись;

8. EXIT WHEN курсор%NOTFOUND

9. IF запись.номер_счёта=номер_1

THEN остаток_1=записьюостаток-сумма

ELSE остаток1=запись.остаток+сумма

END IF;

10. UPDATE счёт SET остаток=остаток1

WHERE CURRENT OF курсор;

11. END LOOP;

12. CLOSE курсор;

13. COMMIT;

14 END;

Примечание:

В этом примере использована упрощённая схема проводки, т.к. реально используется не 1 поле остаток, а пара полей для указания суммы по дебету и кредиту.

 

1. Эту процедуру модно добавить в качестве хранимой процедуры в DDL сценарии, сгенерированным пакетом ERWIN.

1.a. описание переменной остаток1.

2. декларативный оператор, который описывает курсор, имеющий входные параметры номер_счёта_1 и номер_счёта_2. В курсоре определяется оператор SELECT для обновления читаемых записей (FOR UPDATE).

3. Декларативный оператор, который строит переменную запись, состоящий из полей номер_счёта и остаток.

4. Начало исполнительной части процедуры.

5. Открываем курсор. После подстановки параметров оператор SELECT автоматически передается на сервер БД и там выполняется. Результаты поиска возвращается обратно в процедуру в виду множества записей курсора.

6-11 обработка записей курсора.

6. Начать цикл.

7. Переслать очередную запись курсора в переменную «запись».

8. Выйти из цикла, если все записи курсора обработаны.

9. Условный оператор, который определяет новое значение остатка в переменной «остаток1».

10. Обновляет текущую запись курсора в БД. После постановки параметров этот оператор UPDATE передается на сервер БД и там выполняется

11. Завершает цикл, начатый в п. 6

12. Закрыть курсор. После этого записи курсора становятся недоступны.

13. Разблокируются все заблокированные записи и завершается транзакция.

14. Завершить описание процедуры.

 

 

Схема блокировки и обновление записей при одновременном обращении и процедуре «проводка»

WS1, проводка (100,1001,300) WS2, проводка (WS1,100,150)
Оператор процедуры Действия ядра СУБД Оператор процедуры Действия ядра СУБД
OPEN Выполняется SELECT и найденные записи 100 и 1001 блокируются OPEN Оператор SELECT переводится в состояние ожидания, т.к. записи 1001 и 100 уже заблокированы
UPDATE Обновляется сегмент отката, сама БД не обновляется
№ счета
Остаток

 

  Состояние ожидания
COMMIT Записи и сегмента отката переписываются в БД.   Счет
№ счета
Остаток

 

Записи 100 и 1001 разблокируются.

  Выполняется оператор SELECT (т.к. записи 100 и 1001 разблокированы). При этом записи 100 и 1001 вновь блокируются. При поиске используется обновленная таблица «Счет».
    UPDATE Обновляются записи сегмента отказа. Записи в БД не обновляются
№ счета
Остаток
    COMMIT Записи из сегмента отката переписываются в БД Счет
№ счета
Остаток

Записи 100 и 1001 разблокируются.

По оператору UPDATE обновленные записи видны только клиенту, который делает этот оператор UPDATE. Другие клиенты не видят их. Эти изменения становятся доступными другим клиентами после выполнения оператора COMMIT.

 


Поделиться:

Дата добавления: 2015-04-21; просмотров: 61; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.005 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты