№13. Работа с базами данных

Тема: Работа с базой данных

Время на выполнение: 120 минут

Задание

  1. Получить из очереди сообщение кредитной анкеты
  2. По ID продукта вытащить из БД данные по продукту для определения ставки
  3. Сохранить данные заявки в базу данных
    1. Клиентские данные в одну таблицу
    2. Данные о кредите в другую таблицу

Выполнение

Database Development

Откройте представление Database Development
image003
Создайте новое подключение к базе данных:
image004

Параметры подключения:
image005

Выберите базу данных Oracle (1) и тип jdbc драйвера (2)
image006

После этого нажмите на синий треугольник (3) что бы подключить jar библиотеку

Удалите существующий драйвер
image007

Добавьте новую библиотеку:
image008
image009

Нажмите ОК

Заполните следующие параметры (1):
image010

Для проверки связи нажмите «Test Connection» (2)

Удачное соединение
image011

Нажмите Finish

Установленное соединение:
image012

Откройте новый sql файл
image013

image014

Создайте таблицу для продуктов:

CREATE TABLE "VS"."LAB_PROD" (
                               "ID" VARCHAR2(10) NOT NULL,
                               "NAME" VARCHAR2(100),
                               "BEGINDATE" DATE,
                               "ENDDATE" DATE,
                               "TYPE" NUMBER,
                               "MINSUM" NUMBER,
                               "MAXSUM" NUMBER
                )
                LOGGING;

CREATE UNIQUE INDEX "VS"."LAB_PROD_PK"
                ON "VS"."LAB_PROD"
                ("ID"                       ASC)
                LOGGING;

ALTER TABLE "VS"."LAB_PROD" ADD CONSTRAINT "LAB_PROD_PK" PRIMARY KEY
                ("ID");

image015

Запустите крипт F5
image016

Создайте таблицу для ставок:

CREATE TABLE "VS"."LAB_PROD_TARIFF" (
                               "PRODID" VARCHAR2(10) NOT NULL,
                               "PERIOD" NUMBER(2 , 0) NOT NULL,
                               "RATE" NUMBER(4 , 2)
                )
                LOGGING;

CREATE UNIQUE INDEX "VS"."LAB_PROD_TARIFF_PK"
                ON "VS"."LAB_PROD_TARIFF"
                ("PRODID"                              ASC,
                "PERIOD"                             ASC)
                LOGGING;

ALTER TABLE "VS"."LAB_PROD_TARIFF" ADD CONSTRAINT "LAB_PROD_TARIFF_PK" PRIMARY KEY
                ("PRODID",
                "PERIOD");

ALTER TABLE "VS"."LAB_PROD_TARIFF" ADD CONSTRAINT "LAB_PROD_TARIFF_FK" FOREIGN KEY
                ("PRODID")
                REFERENCES "VS"."LAB_PROD"
                ("ID")
                ON DELETE CASCADE;

image017

Запустите крипт F5
image018

Загрузите данные в таблицы.

LAB_PROD
image019

image020

image021

LAB_PROD_TARIFF
image022

image023

Разработка потока

Создайте 2 очереди:

  • 13.IN
  • 13.OUT

image024

Импортируйте в библиотеку LAB.7.LIB новую схему данных и XML файл заявки:
image025

Application.xml

<?xml version="1.0" encoding="UTF-8"?>
<Q1:Application id="1" xmlns:Q1="http://sharavara.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xsi:schemaLocation="http://sharavara.com Application.xsd ">
<Client id="1">
   <LastName>Sharavara</LastName>
   <FirstName>Vitaliy</FirstName>
   <DOB>1981-11-13</DOB>
   <Passport>
     <Number>AA123451</Number>
     <Date>2001-10-03</Date>
   </Passport>
   <Phones>
   <Phone type="mobile">+380678334523</Phone>
   <Phone type="home">+380442732114</Phone>
   </Phones>
</Client>
<Product>1</Product>
<Sum>400000</Sum>
<Period>4</Period>
</Q1:Application>

Создайте новое приложение LAB.13:
image026

Подключите библиотеку LAB.7.LIB
image027

image028

Создайте новый поток Database
image029

Перетащите в рабочую область следующие ноды, переименуйте их и соедините так как указано на рисунке:
image030

Свойства нод:

LAB.13.IN
image031

image032

GetProd
image033

SaveData
image034

LAB.13.OUT
image035

Двойным кликом по но дам GetProd и SaveData создайте ESQL модули
image036
Для модуля  image037  введите следующий код:

 

CALL CopyMessageHeaders();
           CALL CopyEntireMessage();
           DECLARE ref REFERENCE TO InputRoot.XMLNSC.ns:Application ;
           SET Environment.Variables.Prod[] = SELECT * FROM Database.VS.LAB_PROD AS P
           WHERE P.ID = ref.Product ;

image038

Желтый треугольник на полях сигнализирует о том, что невозможно найти модель базы данных для проверки имен таблиц и полей.

Создадим модель базы данных:
image039

Выберите БД Oracle и нажмите New
image040

Имя нового проекта для модели базы данных: LAB.13.DB
image041

image042

Далее
image043

image044

image045

Созданная модель базы данных:
image046

Подключите созданный проект базы данных к приложению LAB.13
image047

image048

image049

Выполните команду:
image050

image051

Предупреждения пропали и стала доступна контекстная подсказка:
image052

Замените код в модуле на нижеследующий:

                               CALL CopyMessageHeaders();
                               CALL CopyEntireMessage();
                               DECLARE ref REFERENCE TO InputRoot.XMLNSC.ns:Application ;
                               SET Environment.Variables.Prod[] = SELECT
                               P.ID,
                               P.NAME,
                               P.TYPE,
                               P.BEGINDATE,
                               P.ENDDATE,
                               P.MAXSUM,
                               P.MINSUM
                               FROM Database.VS.LAB_PROD AS P
                               WHERE P.ID = ref.Product ;

                               SET Environment.Variables.Prod.Tariff = THE(SELECT
                               T.PERIOD,
                               T.RATE
                               FROM Database.LAB_PROD_TARIFF AS T
                               WHERE T.PRODID = ref.Product AND T.PERIOD = ref.Period);      
                               RETURN TRUE;

image053

Для модуля Database_SaveData.esql пропишите следующий код:

CALL CopyMessageHeaders();
CALL CopyEntireMessage();
DECLARE ref REFERENCE TO InputRoot.XMLNSC.ns:Application;

--Save Client
INSERT INTO Database.LAB_CLIENT (
   ID,
   LASTNAME,
   FIRSTNAME,
   DOB,
   PNUM,
   PDATE
 )
 VALUES (
   ref.Client.id,
   ref.Client.LastName,
   ref.Client.FirstName,
   ref.Client.DOB,
   ref.Client.Passport.Number,
   ref.Client.Passport.Date
);

--Save Phones
INSERT INTO Database.LAB_CLIENT_PHONES (
   CLIENTID,
   PTYPE,
   PHONE )
 VALUES (
   ref.Client.id,
   ref.Client.Phones.Phone.type,
   ref.Client.Phones.Phone  
);

--Save Dial
INSERT INTO Database.LAB_DEALS (
   ID,
   CLIENTID,
   PRODID,
   TERM,
   RATE,
   AMOUNT,
   BEGINDATE,
   ENDDATE )
 VALUES (
   ref.id,
   ref.Client.id,
   Environment.Variables.Prod.ID,
   Environment.Variables.Prod.Tariff.PERIOD,
   Environment.Variables.Prod.Tariff.RATE,
   ref.Sum,
   CURRENT_DATE,
   CURRENT_DATE + CAST(ref.Period AS INTERVAL MONTH)
);

RETURN TRUE;

image054

Обработка ошибок

Подключите к приложение библиотеку для логирования ошибок:
image055

image056

Перетащите в рабочую область подпоток логирования из библиотеке Sys.Log.Lib
image057

Соедините ноды:
image058

Добавьте к потоку ноду Throw и соедините ее как показано на рисунке:
image059

Тестирование потока

Запустите тест потока. В качестве тестового сообщения укажите следующий XML:

<?xml version="1.0" encoding="UTF-8"?>
<Q1:Application id="1" xmlns:Q1="http://sharavara.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance" xsi:schemaLocation="http://sharavara.com Application.xsd ">
<Client id="1">
   <LastName>Sharavara</LastName>
   <FirstName>Vitaliy</FirstName>
   <DOB>1981-11-13</DOB>
   <Passport>
     <Number>AA123451</Number>
     <Date>2001-10-03</Date>
   </Passport>
   <Phones>
   <Phone type="mobile">+380678334523</Phone>
   <Phone type="home">+380442732114</Phone>
   </Phones>
</Client>
<Product>1</Product>
<Sum>400000</Sum>
<Period>4</Period>
</Q1:Application>

image060

Таблицы посмотрите через Web интерфейс Oracle Apex

http://localhost:8080/apex
image061

image062

image063

Если повторно запустить тест, то возникнет ошибка из-за нарушения ключа в таблице:
image064

Ошибка сохранится в файле: /home/vs/broker/syslog.txt
image065

image066