КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Типовая процедура обновления записей в БД.
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. Завершить описание процедуры.
Схема блокировки и обновление записей при одновременном обращении и процедуре «проводка»
По оператору UPDATE обновленные записи видны только клиенту, который делает этот оператор UPDATE. Другие клиенты не видят их. Эти изменения становятся доступными другим клиентами после выполнения оператора COMMIT.
|