Advertisement
Aqib12

Untitled

Jul 21st, 2020
1,818
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 6.08 KB | None | 0 0
  1. SET serveroutput ON size 1000000;
  2.  
  3. DROP TABLE Accounts;
  4. DROP TABLE AccountProperties;
  5.  
  6.  
  7.  
  8. CREATE TABLE AccountProperties
  9. (
  10.     ID    int primary key,
  11.     Name  VARCHAR(20),
  12.     iRATE NUMBER,
  13.     GP    NUMBER
  14. );
  15.  
  16.  
  17. INSERT INTO AccountProperties
  18. VALUES (1, 'savings', 5, 1);
  19. INSERT INTO AccountProperties
  20. VALUES (2, 'current', 10, 2);
  21. INSERT INTO AccountProperties
  22. VALUES (3, 'deposit', 15, 3);
  23. INSERT INTO AccountProperties
  24. VALUES (4, 'savings', 20, 4);
  25. INSERT INTO AccountProperties
  26. VALUES (5, 'deposit', 25, 5);
  27.  
  28.  
  29. CREATE TABLE Accounts
  30. (
  31.     ID               VARCHAR(40),
  32.     Name             VARCHAR(20),
  33.     AccCode          NUMBER,
  34.     Balance          NUMBER(10, 2),
  35.     LastDateInterest DATE,
  36.     PRIMARY KEY (ID, AccCode),
  37.     FOREIGN KEY (AccCode) REFERENCES AccountProperties (ID)
  38. );
  39.  
  40.  
  41. INSERT INTO Accounts
  42. VALUES ('4018-300-101', 'Aqib', 1, 1000, TO_DATE('10/01/2019', 'DD/MM/YYYY'));
  43. INSERT INTO Accounts
  44. VALUES ('4018-300-102', 'Shakib ', 2, 10000, TO_DATE('10/01/2019', 'DD/MM/YYYY'));
  45. INSERT INTO Accounts
  46. VALUES ('4018-300-103', 'Salauddin', 3, 20000, TO_DATE('10/01/2019', 'DD/MM/YYYY'));
  47. INSERT INTO Accounts
  48. VALUES ('4018-300-104', 'Roni', 4, 30000, TO_DATE('10/01/2019', 'DD/MM/YYYY'));
  49. INSERT INTO Accounts
  50. VALUES ('4018-300-105', 'Rafat', 5, 40000, TO_DATE('10/01/2019', 'DD/MM/YYYY'));
  51.  
  52. CREATE OR REPLACE FUNCTION calculateProfit(account_ID IN VARCHAR2)
  53.     RETURN NUMBER
  54.     IS
  55.     profit                  NUMBER;
  56.     acc_code                NUMBER;
  57.     interest_rate           NUMBER;
  58.     grace_period            NUMBER;
  59.     present_balance         NUMBER;
  60.     divider                 NUMBER;
  61.     last_date_withdrawn     DATE;
  62.     final_updated_last_date DATE;
  63. BEGIN
  64.     SELECT AccCode INTO acc_code FROM Accounts WHERE ID = account_ID;
  65.     SELECT Balance INTO present_balance FROM Accounts WHERE ID = account_ID;
  66.     SELECT LastDateInterest INTO last_date_withdrawn FROM Accounts WHERE ID = account_ID;
  67.     SELECT iRATE INTO interest_rate FROM AccountProperties WHERE ID = acc_code;
  68.     SELECT GP INTO grace_period FROM AccountProperties WHERE ID = acc_code;
  69.     IF grace_period = 1 THEN
  70.         divider := 365;
  71.         profit := (present_balance * interest_rate / divider) * FLOOR(SYSDATE - last_date_withdrawn);
  72.         final_updated_last_date := SYSDATE;
  73.     ELSIF grace_period = 2 THEN
  74.         divider := 12;
  75.         profit := (present_balance * interest_rate / divider) * FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn));
  76.         final_updated_last_date := last_date_withdrawn + FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn)) * 30;
  77.     ELSIF grace_period = 3 THEN
  78.         divider := 4;
  79.         profit := (present_balance * interest_rate / divider) *
  80.                   FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn) / (12 / divider));
  81.         final_updated_last_date :=
  82.                     last_date_withdrawn +
  83.                     FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn) / (12 / divider)) * 30 * (12 / divider);
  84.     ELSIF grace_period = 4 THEN
  85.         divider := 2;
  86.         profit := (present_balance * interest_rate / divider) *
  87.                   FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn) / (12 / divider));
  88.         final_updated_last_date :=
  89.                     last_date_withdrawn +
  90.                     FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn) / (12 / divider)) * 30 * (12 / divider);
  91.     ELSIF grace_period = 5 THEN
  92.         divider := 1;
  93.         profit := (present_balance * interest_rate) * FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn) / 12);
  94.         final_updated_last_date :=
  95.                     last_date_withdrawn +
  96.                     FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn) / (12 / divider)) * 30 * (12 / divider);
  97.     END IF;
  98.     RETURN profit;
  99. END;
  100. /
  101.  
  102. DECLARE
  103.     ans NUMBER;
  104. BEGIN
  105.     ans := calculateProfit('4018-300-101');
  106.     DBMS_OUTPUT.PUT_LINE(ans);
  107. END;
  108. /
  109.  
  110.  
  111. CREATE OR REPLACE PROCEDURE update_values
  112.     IS
  113.     profit                  NUMBER;
  114.     acc_code                NUMBER;
  115.     grace_period            NUMBER;
  116.     divider                 NUMBER;
  117.     last_date_withdrawn     DATE;
  118.     final_updated_last_date DATE;
  119.     CURSOR lists IS SELECT *
  120.                     FROM Accounts;
  121. BEGIN
  122.     FOR ele IN lists
  123.         LOOP
  124.             profit := calculateProfit(ele.ID);
  125.             acc_code := ele.AccCode;
  126.             SELECT GP INTO grace_period FROM AccountProperties WHERE ID = ele.ID;
  127.             IF profit > 0 THEN
  128.                 IF grace_period = 1 THEN
  129.                     divider := 365;
  130.                     final_updated_last_date := SYSDATE;
  131.                 ELSIF grace_period = 2 THEN
  132.                     divider := 12;
  133.                     final_updated_last_date :=
  134.                                 last_date_withdrawn + FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn)) * 30;
  135.                 ELSIF grace_period = 3 THEN
  136.                     divider := 4;
  137.                     final_updated_last_date :=
  138.                                 last_date_withdrawn +
  139.                                 FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn) / (12 / divider)) * 30 *
  140.                                 (12 / divider);
  141.                 ELSIF grace_period = 4 THEN
  142.                     divider := 2;
  143.                     final_updated_last_date :=
  144.                                 last_date_withdrawn +
  145.                                 FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn) / (12 / divider)) * 30 *
  146.                                 (12 / divider);
  147.                 ELSIF grace_period = 5 THEN
  148.                     divider := 1;
  149.                     final_updated_last_date :=
  150.                                 last_date_withdrawn +
  151.                                 FLOOR(MONTHS_BETWEEN(SYSDATE, last_date_withdrawn) / (12 / divider)) * 30 *
  152.                                 (12 / divider);
  153.                 END IF;
  154.  
  155.                 UPDATE Accounts
  156.                 SET LastDateInterest = final_updated_last_date,
  157.                     Balance          = Balance + profit
  158.                 WHERE ID = ele.ID;
  159.             END IF;
  160.         END LOOP;
  161. END;
  162. /
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement