-- Таблица банков, зарегистрированных в клиринговой палате
CREATE TABLE Banks
(
BankID Number(8) -- Индентификационный № банка
CONSTRAINT bankno_pk PRIMARY KEY,
BankName VARCHAR2(100) NOT NULL -- Наименование банка
CONSTRAINT bankname UNIQUE,
UserName VARCHAR(20) NOT NULL -- Имя пользователя для входа
CONSTRAINT username UNIQUE
);
-----------------------------------------------
-- Модуль BankState
-- Таблица состояния банков-участников в текущем сеансе
-----------------------------------------------
PROMPT Creating table BankState...
CREATE TABLE BankState
(
BankID NUMBER(8) -- Идентификатор банка
CONSTRAINT sessionbankid_fk REFERENCES Banks ON DELETE CASCADE,
BankStatus NUMBER(3) NOT NULL -- Статус банка в текущем сеансе
);
-----------------------------------------------
-- Пакет ClientUtils
-- Интерфейс модуля "АРМ оператора банка"
-----------------------------------------------
PROMPT Creating package ClientUtils...
CREATE OR REPLACE PACKAGE ClientUtils
AS
-- Возвращает флаг состояния текущей сессии
FUNCTION GetSessionStatus RETURN INT;
-- Процедура начала клирингового сеанса для банка-участника
FUNCTION StartBankSession(aBankID IN INT) RETURN INT;
-- Процедура завершения клирингового сеанса для банка-участника
PROCEDURE StopBankSession(aBankID IN INT);
-- Возвращает уникальный номер вызвавшего банка
FUNCTION GetOurID RETURN INT;
-- Возвращает окончательног сальдо банка
FUNCTION GetFinalSaldo(aBankID IN INT) RETURN INT;
-- Процедура отсылки в клиринговую палату платежа в "электронном" виде
PROCEDURE SendMessage(aSourceBankID IN INT,
aDebitBankID IN INT,
aCreditBankID IN INT,
aAmount IN INT);
END ClientUtils;
/
SHOW ERROR;
-----------------------------------------------
-- Пакет процедур для работы банков-клиентов клиринговой палаты
-----------------------------------------------
PROMPT Creating package body ClientUtils...
CREATE OR REPLACE PACKAGE BODY ClientUtils
AS
-- Функция возвращает флаг состояния текущей сессии
FUNCTION GetSessionStatus RETURN INT
IS
BEGIN
RETURN ServerUtils.SessionState;
END GetSessionStatus;
-- Процедура подключения банка к очередной сессии клиринговой палаты
-- Выполняется каждый рабочий день в определенное время после выполнения
-- на сервере КП процедуры инициализации клирингового сеанса
FUNCTION StartBankSession(aBankID IN INT) RETURN INT
IS
BEGIN
IF ServerUtils.SessionState = GlobalConst.cSessionActive THEN
UPDATE BankState
SET BankStatus = GlobalConst.cBankWork
WHERE BankID = aBankID;
END IF;
RETURN ServerUtils.SessionState;
END StartBankSession;
-- Процедура выхода банка из текущего клирингового сеанса
-- Выполняется кажый день в определенное время до закрытия сеанса
-- на сервере КП
PROCEDURE StopBankSession(aBankID IN INT)
IS
BEGIN
UPDATE BankState
SET BankStatus = GlobalConst.cBankStopWork
WHERE BankId = aBankID;
END StopBankSession;
-- Функция возвращает уникальный номер вызывающего банка
FUNCTION GetOurID RETURN INT
IS
Res INT;
BEGIN
SELECT BankID INTO Res FROM Banks
WHERE UserName = USER;
END GetOurID;
-- Функция возвращает чистую позицию банка по окончанию сеанса
FUNCTION GetFinalSaldo(aBankID IN INT) RETURN INT
IS
aSaldo INT;
BEGIN
BEGIN
SELECT DebitPos-CreditPos INTO aSaldo FROM Results
WHERE BankID = aBankID;
EXCEPTION
WHEN No_Data_Found THEN aSaldo := NULL;
END;
RETURN aSaldo;
END GetFinalSaldo;
-- Процедура отсылки на сервер КП "электронного" платежа
PROCEDURE SendMessage(aSourceBankID IN INT,
aDebitBankID IN INT,
aCreditBankID IN INT,
aAmount IN INT)
IS
aMsgID INT;
BEGIN
SELECT Msg_Seq.NextVal INTO aMsgID FROM Dual;
INSERT INTO Messages
VALUES (aMsgID, aSourceBankID, aDebitBankID,
aCreditBankID, aAmount, GlobalConst.cMsgNotProcessed);
END SendMessage;
END ClientUtils;
/
SHOW ERROR;
-----------------------------------------------
-- Пакет CommonUtils
-- Интерфейс общих подпрограмм
-----------------------------------------------
PROMPT Creating package CommonUtils...
CREATE OR REPLACE PACKAGE CommonUtils
AS
-- Возвращает уникальный номер банка по его имени
FUNCTION GetBankID(aBankName IN VARCHAR2) RETURN INT;
-- Возвращает текущее дебетовое сальдо
FUNCTION GetCurrentDebitSaldo(aBankID IN INT) RETURN INT;