· 6 years ago · Jun 17, 2019, 11:52 AM
1-- CREATE SCHEMA pko;
2-- CREATE TABLE pko.klienci(
3-- id_klienta BIGINT PRIMARY KEY NOT NULL,
4-- nazwisko VARCHAR(50) NOT NULL,
5-- imie VARCHAR(25),
6-- kategoria VARCHAR(25) NOT NULL,
7-- CONSTRAINT ograniczenie_1 CHECK(kategoria = 'indyswidualny' OR kategoria = 'biznesowy' OR kategoria = 'instytucjonalny')
8-- );
9
10-- CREATE TABLE pko.rachunki_bankowe(
11-- nrb CHARACTER(26) PRIMARY KEY NOT NULL,
12-- id_klienta BIGINT NOT NULL,
13-- rodzaj_rachunku VARCHAR(30) NOT NULL,
14-- CONSTRAINT klucz_obcy FOREIGN KEY (id_klienta) REFERENCES pko.klienci(id_klienta)
15-- );
16
17-- CREATE TABLE pko.transakcje(
18-- id_transakcji BIGINT PRIMARY KEY NOT NULL,
19-- nrb CHARACTER(26) NOT NULL,
20-- data_czas_transakcji TIMESTAMP with time zone NOT NULL,
21-- kwota MONEY NOT NULL,
22-- rodzaj_operacji VARCHAR(50),
23-- CONSTRAINT klucz_obcy2 FOREIGN KEY(nrb) REFERENCES pko.rachunki_bankowe(nrb),
24-- CONSTRAINT ograniczenie_2 CHECK(rodzaj_operacji = 'wpłata' OR rodzaj_operacji = 'wypłata' OR rodzaj_operacji = 'prowizja' OR rodzaj_operacji = 'przelew przychodzący' OR rodzaj_operacji = 'przelew wychodzący')
25-- );
26
27-- INSERT INTO pko.klienci VALUES(1,'Jeleń','Karol','indyswidualny');
28-- INSERT INTO pko.klienci VALUES(2,'Łania','Sylwia','biznesowy');
29-- INSERT INTO pko.klienci VALUES(3,'Sarna','Marta','indyswidualny');
30
31
32-- INSERT INTO pko.rachunki_bankowe VALUES('55555555551111111111999999',1,'rozliczeniowo-oszczędnościowy');
33-- INSERT INTO pko.rachunki_bankowe VALUES('33333333330000000000111111',2,'rozliczeniowo-oszczędnościowy');
34-- INSERT INTO pko.rachunki_bankowe VALUES('11111111112222222222333333',2,'oszczędnościowy');
35-- INSERT INTO pko.rachunki_bankowe VALUES('99999999998888888888777777',3,'rozliczeniowo-oszczędnościowy');
36
37-- INSERT INTO pko.transakcje VALUES(1,'33333333330000000000111111','2019-05-01 08:22',4000,'wpłata');
38-- INSERT INTO pko.transakcje VALUES(2,'11111111112222222222333333','2019-05-03 23:56',2000,'przelew przychodzący');
39-- INSERT INTO pko.transakcje VALUES(3,'33333333330000000000111111','2019-05-06 12:33',-1000,'wypłata');
40-- INSERT INTO pko.transakcje VALUES(4,'33333333330000000000111111','2019-05-12 09:41',-400,'wypłata');
41-- INSERT INTO pko.transakcje VALUES(5,'33333333330000000000111111','2019-05-12 09:41',-5,'prowizja');
42
43--KONIEC ZAD 1
44
45
46
47-- CREATE OR REPLACE FUNCTION pko.obliczSaldoRachunkowe(nrb_f CHARACTER(26),data_poczatkowa TIMESTAMP with time zone,data_koncowa TIMESTAMP with time zone)
48-- RETURNS MONEY AS
49-- $BODY$
50-- DECLARE
51-- wynik MONEY := 0;
52-- BEGIN
53-- IF(data_koncowa M data_poczatkowa) THEN
54-- RAISE NOTICE 'Niepoprawne argumenty dla daty';
55-- RETURN NULL;
56-- END IF;
57-- IF((SELECT rodzaj_rachunku FROM pko.rachunki_bankowe WHERE nrb = nrb_f) IS NULL) THEN
58-- RAISE NOTICE 'Nie ma takiego rachunku';
59-- RETURN NULL;
60-- END IF;
61-- wynik = (SELECT SUM(kwota) FROM pko.transakcje WHERE nrb = nrb_f AND data_czas_transakcji BETWEEN data_poczatkowa AND data_koncowa);
62-- RETURN WYNIK;
63-- END;
64-- $BODY$ LANGUAGE 'plpgsql';
65--
66-- SELECT pko.obliczSaldoRachunkowe('33333333330000000000111111','2019-05-01','2019-05-31');
67-- SELECT pko.obliczSaldoRachunkowe('22222222229999999999666666','2019-01-01','2019-04-30');
68
69
70
71
72CREATE OR REPLACE FUNCTION pko.wyzwalacz()
73RETURNS TRIGGER AS
74
75 DECLARE
76 prowizja MONEY := 0;
77 indeks INTEGER := 0;
78 BEGIN
79 IF(NEW.rodzaj_operacji IN ('wypłata','przelew wychodzący')) THEN
80 IF((SELECT COUNT(*) FROM pko.transakcje WHERE data_czas_transakcji = NEW.data_czas_transakcji) = 0) THEN
81 RETURN NULL;
82 ELSE
83 IF(NEW.kwota*0.01 M 5::MONEY) THEN
84 prowizja := 5;
85 ELSE
86 prowizja := NEW.kwota*0.01;
87 END IF;
88 indeks := NEW.id_transakcji + 1;
89 INSERT INTO pko.transakcje VALUES(indeks,NEW.nrb,NEW.data_czas_transakcji,prowizja,NEW.rodzaj_operacji);
90 END IF;
91 END IF;
92 RETURN NULL;
93 END;
94
95LANGUAGE 'plpgsql' VOLATILE;
96
97DROP TRIGGER IF EXISTS operacja_wyzwalacza ON pko.transakcje;
98CREATE TRIGGER operacja_wyzwalacza AFTER INSERT
99ON pko.transakcje FOR EACH ROW
100EXECUTE PROCEDURE pko.wyzwalacz();
101
102INSERT INTO pko.transakcje VALUES(6,'33333333330000000000111111',CURRENT_DATE,-400,'wypłata');