Есть таблица вкладчиков KK_DEPOSIT вида
| DEPOSIT_ID
| CLIENT_NAME
| DT
| AMOUNT
|
|
| Карапетян
| 30.01.2011
| 123,89
|
|
| Карапетян
| 31.01.2011
| 129,8
|
|
| Саахов
| 24.09.2011
| 123123,91
|
|
| Саахов
| 27.11.2011
| 90,98
|
|
| Саахов
| 13.05.2010
|
|
|
| Растрелли
| 10.01.2012
|
|
Написать пакет из функций по нахождению:
· последней даты вклада по входному параметру IN_CLIENT_NAME
· суммы всех вкладов по входному параметру IN_CLIENT_NAME
· суммы последних двух вкладов (или 0 или 1 вкладов, если нет двух) по входному параметру IN_CLIENT_NAME
Создадим таблицу и заполним данными:
CREATE TABLE KK_DEPOSIT(DEPOSIT_ID INTEGER, CLIENT_NAME VARCHAR2(40), DT DATE, AMOUNT NUMBER);
insert into kk_deposit(deposit_id,client_name,dt,amount) values(1,'Карапетян',to_date('30.01.2011','dd.mm.yyyy'),123.89);
insert into kk_deposit(deposit_id,client_name,dt,amount) values(2,'Карапетян',to_date('31.01.2011','dd.mm.yyyy'),129.8);
insert into kk_deposit(deposit_id,client_name,dt,amount) values(3,'Саахов',to_date('24.09.2011','dd.mm.yyyy'),123123.91);
insert into kk_deposit(deposit_id,client_name,dt,amount) values(4,'Саахов',to_date('27.11.2011','dd.mm.yyyy'),90.98);
insert into kk_deposit(deposit_id,client_name,dt,amount) values(5,'Саахов',to_date('13.05.2010','dd.mm.yyyy'),8000000);
insert into kk_deposit(deposit_id,client_name,dt,amount) values(6,'Растрелли',to_date('10.01.2012','dd.mm.yyyy'),1100000);
Напишем заголовок пакета:
CREATE OR REPLACE PACKAGE KK_PKG33 IS
FUNCTION GET_LAST_DEPOSIT_DATE(IN_CLIENT_NAME IN VARCHAR2) RETURN DATE;
FUNCTION GET_SUM_ALL_DEPOSITS(IN_CLIENT_NAME IN VARCHAR2) RETURN NUMBER;
FUNCTION GET_SUM_LAST_2_DEPOSITS(IN_CLIENT_NAME IN VARCHAR2) RETURN NUMBER;
END KK_PKG33;
Напишем тело пакета:
CREATE OR REPLACE PACKAGE BODY KK_PKG33 IS
FUNCTION GET_LAST_DEPOSIT_DATE(IN_CLIENT_NAME IN VARCHAR2) RETURN DATE IS
RES DATE;
BEGIN
SELECT NVL(MAX(DT), TO_DATE('01.01.1900', 'DD.MM.YYYY'))
INTO RES
FROM KK_DEPOSIT
WHERE CLIENT_NAME = IN_CLIENT_NAME;
RETURN RES;
END GET_LAST_DEPOSIT_DATE;
FUNCTION GET_SUM_ALL_DEPOSITS(IN_CLIENT_NAME IN VARCHAR2) RETURN NUMBER IS
RES NUMBER;
BEGIN
SELECT NVL(SUM(AMOUNT), 0)
INTO RES
FROM KK_DEPOSIT
WHERE CLIENT_NAME = IN_CLIENT_NAME;
RETURN RES;
END GET_SUM_ALL_DEPOSITS;
FUNCTION GET_SUM_LAST_2_DEPOSITS(IN_CLIENT_NAME IN VARCHAR2) RETURN NUMBER IS
RES NUMBER;
BEGIN
SELECT NVL(SUM(AMOUNT), 0)
INTO RES
FROM (SELECT AMOUNT, ROW_NUMBER() OVER(ORDER BY DT DESC) RN
FROM KK_DEPOSIT
WHERE CLIENT_NAME = IN_CLIENT_NAME)
WHERE RN IN (1, 2);
RETURN RES;
END GET_SUM_LAST_2_DEPOSITS;
END KK_PKG33;
Проверим результат:
SELECT CLIENT_NAME,
KK_PKG33.GET_LAST_DEPOSIT_DATE(CLIENT_NAME),
KK_PKG33.GET_SUM_ALL_DEPOSITS(CLIENT_NAME),
KK_PKG33.GET_SUM_LAST_2_DEPOSITS(CLIENT_NAME)
FROM (SELECT DISTINCT CLIENT_NAME
FROM KK_DEPOSIT
UNION ALL
SELECT 'Несуществующий' CLIENT_NAME FROM DUAL);