Межбанковский клиринг

Страница 10

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;

-- Возвращает текущее кредитовое сальдо

FUNCTION GetCurrentCreditSaldo(aBankID IN INT) RETURN INT;

END CommonUtils;

/

SHOW ERROR;

-----------------------------------------------

-- Процедуры и функции общего пользования

-----------------------------------------------

PROMPT Creating package CommonUtils .

CREATE OR REPLACE PACKAGE BODY CommonUtils

AS

-- Возвращает уникальный идентификатор банка-участника по его имени

FUNCTION GetBankID(aBankName IN VARCHAR2) RETURN INT

IS

Res INT;

BEGIN

BEGIN

SELECT BankID INTO Res FROM Banks

WHERE BankName = aBankName;

EXCEPTION

WHEN No_Data_Found THEN Res := NULL;

END;

RETURN Res;

END GetBankID;

-- Возвращает текущее дебетовое сальдо банка-участника

FUNCTION GetCurrentDebitSaldo(aBankID IN INT) RETURN INT

IS

Res INT;

BEGIN

BEGIN

SELECT DebitPos INTO Res FROM TmpRes

WHERE BankID = aBankID;

EXCEPTION

WHEN No_Data_Found THEN

Res := 0;

END;

RETURN Res;

END GetCurrentDebitSaldo;

-- Возвращает текущее кредитовое сальдо банка-участника

FUNCTION GetCurrentCreditSaldo(aBankID IN INT) RETURN INT

IS

Res INT;

BEGIN

BEGIN

SELECT CreditPos INTO Res FROM TmpRes

WHERE BankID = aBankID;

EXCEPTION

WHEN No_Data_Found THEN

Res := 0;

END;

RETURN Res;

END GetCurrentCreditSaldo;

END CommonUtils;

/

SHOW ERROR;

--------------------------------------------------------

-- Модуль содержит глобальные константы

--------------------------------------------------------

PROMPT Creating package GlobalConst

CREATE OR REPLACE PACKAGE GlobalConst

AS

cStatusClass CONSTANT INT := -1;

cBankWork CONSTANT INT := 1;

cBankStopWork CONSTANT INT := 2;

cBankNotWork CONSTANT INT := 3;

cMsgNotProcessed CONSTANT INT := 1;

cMsgAccepted CONSTANT INT := 2;

cMsgSourceError CONSTANT INT := 3;

cMsgDebitError CONSTANT INT := 4;

cMsgCreditError CONSTANT INT := 5;

cMsgProcessed CONSTANT INT := 6;

cSessionUnActive CONSTANT INT := 1;

cSessionActive CONSTANT INT := 2;

END GlobalConst;

/

SHOW ERROR;

------------------------------------------------------

-- Модуль инициализации системы в СУБД Oracle 7.3.3

------------------------------------------------------

CONNECT INTERNAL

SPOOL createdb.log

SET ECHO ON

CREATE TABLESPACE "CLEARING" DATAFILE 'C:\ORAWIN95\DATABASE\clearing.dbf'

SIZE 5M REUSE DEFAULT STORAGE (INITIAL 10K NEXT 10K MINEXTENTS 1

MAXEXTENTS 120 PCTINCREASE 0);

CREATE USER "ALEX" IDENTIFIED BY "ALEX"

DEFAULT TABLESPACE "CLEARING";

GRANT "DBA" TO "ALEX" WITH ADMIN OPTION;

GRANT UNLIMITED TABLESPACE to "ALEX" WITH ADMIN OPTION;

GRANT SELECT ANY TABLE to "ALEX" WITH ADMIN OPTION;

GRANT GRANT ANY ROLE to "ALEX" WITH ADMIN OPTION;

GRANT CREATE ANY SYNONYM to "ALEX" WITH ADMIN OPTION;

GRANT DROP ANY SYNONYM to "ALEX" WITH ADMIN OPTION;

GRANT EXECUTE ANY PROCEDURE to "ALEX";

GRANT CREATE USER to "ALEX";

GRANT ALTER USER to "ALEX";

GRANT DROP USER to "ALEX";

GRANT GRANT ANY PRIVILEGE to "ALEX";

SPOOL OFF

EXIT

--------------------------------------------------

-- Начальное создание объектов системы

--------------------------------------------------

PROMPT Creating databases and sequences .

@@consts.pkg

@@banks

@@messages

@@status

@@statinit

@@bnkstate

@@results

@@tmpres

@@statist

PROMPT Creating packages .

@@srvrutil.pkg

@@srvrutil.bdy

@@clntutil.pkg

@@clntutil.bdy

@@commutil.pkg

@@commutil.bdy

-------------------------------------------------------------

-- Таблица и последовательность для обработки сообщений

-------------------------------------------------------------

PROMPT Creating sequence Msg_Seq .

CREATE SEQUENCE Msg_Seq

INCREMENT BY 1

START WITH 1

MAXVALUE 99999999

MINVALUE 1

NOCACHE

CYCLE;

PROMPT Creating table Messages .

CREATE TABLE Messages

(

MessageID NUMBER(8) -- Номер сообщения

CONSTRAINT message_pk PRIMARY KEY,

SourceBankID NUMBER(8) -- Банк-источник сообщения

CONSTRAINT sourcebank_fk REFERENCES Banks ON DELETE CASCADE,

DebitBankID NUMBER(8) -- Банк-получатель

CONSTRAINT debitbank_fk REFERENCES Banks ON DELETE CASCADE,

CreditBankID NUMBER(8) -- Банк-плательщик

CONSTRAINT creditbank_fk REFERENCES Banks ON DELETE CASCADE,

Amount INT NOT NULL, -- Сумма

MsgStatus INT NOT NULL -- Статус сообщения

);

--------------------------------------------------------------

-- Таблица окончательных результатов клирингового сеанса

--------------------------------------------------------------