Вы находитесь на странице: 1из 10

Государственный Университет Молдовы

Факультет Математики и Информатики

Департамент Информатики

Индивидуальная работа 1

Выполнил: Циуляну Андрей I2002


Преподаватель: Светлана Бодруг.

Кишинев, 2021
19 Инвестирование свободных средств
Описание предметной области

Вы являетесь руководителем аналитического центра инвестиционной компании.


Ваша компания занимается вложением денежных средств в ценные бумаги. Ваши
клиенты – предприятия, которые доверяют Вам управлять их свободными
денежными средства на определенный период. Вам необходимо выбрать вид
ценных бумаг, которые позволят получить прибыль и Вам и Вашему клиенту. При
работе с клиентом для Вас весьма существенной является информация о
предприятии – название, вид собственности, адрес и телефон.

Таблицы

Ценные бумаги (Код ценной бумаги, Минимальная сумма сделки, Рейтинг,


Доходность за прошлый год, Дополнительная информация ).

Инвестиции (Код инвестиции, Код ценной бумаги, Код клиента, Котировка, Дата
покупки, Дата продажи ).

Клиенты (Код клиента, Название, Вид собственности, Адрес, Телефон ).

Развитие постановки задачи

При эксплуатации базы данных стало понятно, что необходимо хранить историю
котировок каждой ценной бумаги. Кроме того, помимо вложений в ценные бумаги,
существует возможность вкладывать деньги в банковские депозиты.Внести в
структуру таблиц изменения, учитывающие эти факты, и изменить существующие
запросы. Добавить новые запросы.

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


условию, «При эксплуатации базы данных стало понятно, что необходимо хранить историю
котировок каждой ценной бумаги. Кроме того, помимо вложений в ценные бумаги, существует
возможность вкладывать деньги в банковские депозиты. Внести в структуру таблиц изменения,
учитывающие эти факты, и изменить существующие запросы. Добавить новые запросы.» - то,
создадим следующие типы:
CREATE OR REPLACE TYPE papers_objtyp AS OBJECT
(
ID_PAPER number,
PAPER_MIN_DEAL number,
PAPER_RATE number,
PAPER_LAST_YEAR number,
PAPER_COMMENTARY VARCHAR2(30)
);
CREATE OR REPLACE TYPE client_objtyp AS OBJECT
(
ID_CLIENT number,
CLIENT_NAME VARCHAR2(30),
CLIENT_PROPERTY VARCHAR2(30),
CLIENT_ADRESS VARCHAR2(30),
CLIENT_PHONE NUMBER
);

CREATE OR REPLACE TYPE invest_objtyp AS OBJECT


(
ID_INVEST number,
ID_CLIENT_REF ref client_objtyp,
ID_PAPER_REF ref papers_objtyp,
INVEST_PRICE number,
INVEST_DATE_BUY DATE,
INVEST_DATE_SELL DATE
);

CREATE TABLE CLIENT_TAB OF client_objtyp;


CREATE TABLE PAPERS_TAB OF papers_objtyp;
CREATE TABLE INVEST_TAB OF invest_objtyp;
Заполнение таблицы Clients

INSERT INTO CLIENT_TAB VALUES(client_objtyp (1,'McDonalds','Restaurant','bd.qwerty2',111111));


INSERT INTO CLIENT_TAB VALUES(client_objtyp (1,'Andy’s', 'Pizzaria','bd.ytrewq 123',222222));
INSERT INTO CLIENT_TAB VALUES(client_objtyp (1,'Toyota','Vehicles','bd.asdfgh3',333333));
INSERT INTO CLIENT_TAB VALUES(client_objtyp (1, 'Disney', 'Movies','str.zxcvb4',444444));

Заполнение таблицы ценных бумаг PAPERS_TAB

INSERT INTO PAPERS_TAB VALUES(papers_objtyp(1, 105312, 4, 5000, 'Good one'));


INSERT INTO PAPERS_TAB VALUES(papers_objtyp(2, 3043123, 4, 15000, 'Stable one'));
INSERT INTO PAPERS_TAB VALUES(papers_objtyp(3, 1883231, 5, 10000, 'Firm one'));
INSERT INTO PAPERS_TAB VALUES(papers_objtyp(4, 2733321, 3, 15000, 'Excellent one'));

Заполнение таблицы инфестиций в эти самые ценные бумаги INVEST_TAB

DECLARE
c REF client_objtyp;
p REF papers_objtyp;
BEGIN
SELECT REF(z) INTO c FROM CLIENT_TAB z WHERE z.ID_CLIENT = 1;
SELECT REF(q) INTO p FROM PAPERS_TAB q WHERE q.ID_PAPER = 1;
INSERT INTO INVEST_TAB VALUES(invest_objtyp(1,c,p,10000,TO_DATE('01/01/2022','dd.mm.yyyy'),
TO_DATE('01/05/2022', 'dd.mm.yyyy')));
END;

DECLARE
c REF client_objtyp;
p REF papers_objtyp;
BEGIN
SELECT REF(z) INTO c FROM CLIENT_TAB z WHERE z.ID_CLIENT = 2;
SELECT REF(q) INTO p FROM PAPERS_TAB q WHERE q.ID_PAPER = 2;
INSERT INTO INVEST_TAB VALUES(invest_objtyp(2,c,p,50000,TO_DATE('01/01/2022','dd.mm.yyyy'),
TO_DATE('07/10/2022', 'dd.mm.yyyy')));
END;

Выборка информации из таблицы invest_tab используя deref, select

select
ID_INVEST,
DEREF(ID_CLIENT_REF).CLIENT_NAME AS CLIENT_NAME,
DEREF(ID_CLIENT_REF).CLIENT_PROPERTY AS CLIENT_PROPERTY,
DEREF(ID_CLIENT_REF).CLIENT_ADRESS AS CLIENT_ADRESS,
DEREF(ID_PAPER_REF). ID_PAPER AS ID_PAPER,
DEREF(ID_PAPER_REF). PAPER_LAST_YEAR AS PAPER_LAST_YEAR,
DEREF(ID_PAPER_REF). PAPER_RATE AS PAPER_RATE,
INVEST_DATE_BUY,
INVEST_PRICE,
INVEST_DATE_SELL
FROM INVEST_TAB;

Создаю таблицу все инвестиции в бумаги клиента

CREATE TABLE CLIENT_INVEST_TAB


(
ID_CLIENT_REF REF client_objtyp
)

Создаю коллекцию на основании типа invest_objtyp

CREATE OR REPLACE TYPE IVEST_COLLECTION IS TABLE OF invest_objtyp

Добавляю вложенную таблицу

ALTER TABLE CLIENT_INVEST _TAB ADD (


invest_coll INVEST_COLLECTION )
NESTED TABLE invest_coll store as invest_coll;

Заполняю таблицу CLIENTS_APARMENTS_TAB

DECLARE
r REF client_objtyp;
BEGIN
SELECT REF(t) INTO r FROM CLIENT_TAB t WHERE ID_CLIENT = 1;
INSERT INTO CLIENTS_INVEST _TAB VALUES (r,INVEST_COLLECTION ());
END;

Заполняю коллекцию данными

DECLARE
TYPE INVEST_COLL IS TABLE OF invest_objtyp;
COLL INVEST_COLL;
BEGIN
SELECT VALUE(p) BULK COLLECT INTO COLL FROM INVEST_TAB p WHERE
p.ID_CLIENT_REF.ID_CLIENT = 1;
FOR i in 1..COLL.count LOOP
INSERT INTO TABLE(SELECT p.INVEST_COLL FROM CLIENT_INVEST_TAB p WHERE
p.ID_CLIENT_REF.ID_CLIENT = 1) VALUES (COLL(i));
END LOOP;
END;

Выборка данных с помощью select, ref, call

select
p.ID_CLIENT_REF.ID_CLIENT,
P.ID_CLIENT_REF.CLIENT_NAME,
p.ID_CLIENT_REF.CLIENT_PROPERTY,
COLL. INVEST_DATE_BUY,
COLL. INVEST_DATE_SELL,
COLL.ID_INVEST_REF.ID_INVEST
FROM CLIENTS_INVEST_TAB p
JOIN TABLE (p.INVEST_COLL) COLL
on p.id_client_ref.ID_CLIENT = COLL.id_client_ref.ID_CLIENT;

Создаю функцию для подсчета разности инвестированных денег и прошлогодичного дохода

create or replace procedure total_net (


CLIENT_ID NUMBER
)
is type INVEST_COLL is varray(10) of papers_objtyp;
type TIME_TABLE IS RECORD(ID number, COLL INVEST_COLL := INVEST_COLL());
time_t TIME_TABLE;

net number;

begin
net := 0;
time_t.id := CLIENT_ID;

select value(t) bulk collect into time_t.COLL from INVEST_TAB p.PAPER_TAB t where
p.id_client_ref.id_client = CLIENT_ID AND p.id_paper_ref.id_paper = t.id_paper ;

net:= INVEST_PRICE - p.id_paper_ref. PAPER_LAST_YEAR


DBMS_OUTPUT.PUT_LINE('RAZNITSA INVESTITII I DOHODA PROSHLOGO GODA'||net);
end;

BEGIN
total_net (1);
END;

Begin
total_net (1);
end;

Пересоздаю тип Ценных бумаг

CREATE OR REPLACE TYPE papers_objtyp as object(


ID_PAPER number,
PAPER_MIN_DEAL number,
PAPER_RATE number,
PAPER_LAST_YEAR number,
PAPER_COMMENTARY VARCHAR2(30)
NOT FINAL MEMBER FUNCTION SHOW RETURN VARCHAR2,
NOT FINAL MEMBER FUNCTION SHOW (NUM NUMBER) RETURN NUMBER
) NOT FINAL

Создание тела типа ценных бумаг

CREATE OR REPLACE TYPE BODY paper_objtyp AS


NOT FINAL MEMBER FUNCTION SHOW RETURN VARCHAR2 IS
BEGIN
RETURN SELF. ID_PAPER ||SELF. ID_PAPER;
END SHOW;
NOT FINAL MEMBER FUNCTION SHOW(NUM NUMBER) RETURN NUMBER IS
BEGIN
RETURN SELF.ID_PAPER * NUM;
END SHOW;
END;
Создание иерархии типов (наследник (1) ценная бумага первого уровня)

CREATE OR REPLACE TYPE FIRST_LEVEL UNDER paper_objtyp (


LEVEL_PAPER VARCHAR2(30),
OVERRIDING MEMBER FUNCTION SHOW RETURN VARCHAR2,
OVERRIDING MEMBER FUNCTION SHOW(NUM NUMBER) RETURN NUMBER
)

Создание тела первого наследника

CREATE OR REPLACE TYPE BODY FIRST_LEVEL AS


OVERRIDING MEMBER FUNCTION SHOW RETURN VARCHAR2 IS
BEGIN
RETURN ( SELF AS papers_objtyp ).SHOW;
END SHOW;
OVERRIDING MEMBER FUNCTION SHOW(NUM NUMBER) RETURN NUMBER IS
BEGIN
RETURN ( SELF AS papers_objtyp ).SHOW(NUM);
END SHOW;
END;

Создание иерархии типов (наследник (2) ценная бумага второго уровня)

CREATE OR REPLACE TYPE SECOND_LEVEL UNDER papers_objtyp (


LEVEL_PAPER VARCHAR2(30),
OVERRIDING MEMBER FUNCTION SHOW RETURN VARCHAR2,
OVERRIDING MEMBER FUNCTION SHOW(NUM NUMBER) RETURN NUMBER
)

Создание тела второго наследника

CREATE OR REPLACE TYPE BODY SECOND_LEVEL AS


OVERRIDING MEMBER FUNCTION SHOW RETURN VARCHAR2 IS
BEGIN
RETURN ( SELF AS papers_objtyp ).SHOW;
END SHOW;
OVERRIDING MEMBER FUNCTION SHOW(NUM NUMBER) RETURN NUMBER IS
BEGIN
RETURN ( SELF AS papers_objtyp ).SHOW(NUM);
END SHOW;
END;

Тестирование наследников в анонимном блоке

DECLARE
TYPE COLLECTION IS TABLE OF papers_objtyp;
COLL COLLECTION;
BEGIN
COLL := COLLECTION();
COLL.EXTEND;
COLL(1) := FIRST_LEVEL(5,1000,5,300,’Goody one paper’);
COLL.EXTEND;
COLL(2) := SECOND_LEVEL(6,23000,5,4300,’GREAT one paper’)
FOR i in 1..COLL.COUNT
loop
DBMS_OUTPUT.PUT_LINE(COLL(i).show ||' '|| COLL(i).SHOW(5));
END LOOP;
END;

Создание таблицы

CREATE TABLE p_tab OF papers_objtyp

Заполнение данными

INSERT INTO p_tab VALUES (FIRST_LEVEL(5,1000,5,300,’Goody one paper’));


INSERT INTO p_tab VALUES (FIRST_LEVEL(6,7000,5,3300,’Goody one paper’);
INSERT INTO p_tab VALUES (FIRST_LEVEL((7,1000,5,6500,’Goody one paper’));
INSERT INTO p_tab VALUES (SECOND_LEVEL(6,23000,5,4300,’GREAT one paper’));

Выводы:
Данная индивидуальная работа на практике укрепляет все полученные в
течении певрой части семестра знания и навыки ORACLE СУБД, такие как
создание типов, таблиц, использование ссылок и коллекций. Конфигурация,
построение базы данных, логистика и управление функционалом – все это
также оттачивает такая индивидуальная работа.

Вам также может понравиться