Daily Record of Stock Activity
CREATE TABLE daily_record
(
ticker VARCHAR2 (20),
trade_date DATE,
open_price NUMBER,
close_price NUMBER
)
Table created.
Extremely Valuable Stocks
BEGIN
-- Populate the table.
INSERT INTO daily_record
VALUES ('CHICKPEAS',
trunc (SYSDATE),
10,
12);
INSERT INTO daily_record
VALUES ('BROCCOLI',
trunc (SYSDATE),
75,
87);
INSERT INTO daily_record
VALUES ('CHOCOLATE',
trunc (SYSDATE),
500,
2000);
COMMIT;
END;
1 row(s) inserted.
Table of Open and Close Prices
CREATE TABLE open_and_close
(
ticker VARCHAR2 (20),
pricedate DATE,
pricetype VARCHAR2 (1),
price NUMBER
)
Table created.
An Object Type Mimicking the Table
CREATE TYPE open_and_close_ot AS OBJECT
(
ticker VARCHAR2 (20),
pricedate DATE,
pricetype VARCHAR2 (1),
price NUMBER
);
Type created.
Create Nested Table On Object Type
CREATE TYPE open_and_close_nt AS TABLE OF open_and_close_ot;
Type created.
Package with Table Function
CREATE OR REPLACE PACKAGE stock_mgr
IS
TYPE dailies_cur IS REF CURSOR
RETURN daily_record%ROWTYPE;
FUNCTION separate_dailies (dataset_in dailies_cur,
limit_in IN INTEGER DEFAULT 100)
RETURN open_and_close_nt;
END;
Package created.
The Table Function Definition
CREATE OR REPLACE PACKAGE BODY stock_mgr
IS
FUNCTION separate_dailies (dataset_in dailies_cur,
limit_in IN INTEGER DEFAULT 100)
RETURN open_and_close_nt
IS
TYPE dataset_tt IS TABLE OF daily_record%ROWTYPE
INDEX BY PLS_INTEGER;
l_dataset dataset_tt;
l_separated open_and_close_nt := open_and_close_nt ();
BEGIN
LOOP
FETCH dataset_in BULK COLLECT INTO l_dataset LIMIT limit_in;
EXIT WHEN l_dataset.COUNT = 0;
l_separated.EXTEND (l_dataset.COUNT * 2);
FOR indx IN 1 .. l_dataset.COUNT
LOOP
l_separated ( (indx - 1) * 2 + 1) :=
open_and_close_ot (l_dataset (indx).ticker,
l_dataset (indx).trade_date,
'O',
l_dataset (indx).open_price);
l_separated ( (indx - 1) * 2 + 2) :=
open_and_close_ot (l_dataset (indx).ticker,
l_dataset (indx).trade_date,
'C',
l_dataset (indx).close_price);
END LOOP;
END LOOP;
CLOSE dataset_in;
RETURN l_separated;
END;
END;
Package Body created.
Execute Function in FROM Clause
SELECT *
FROM TABLE (stock_mgr.separate_dailies (
CURSOR (SELECT * FROM daily_record)))
ORDER BY ticker, pricedate, pricetype
TICKER | PRICEDATE | PRICETYPE | PRICE | BROCCOLI | 23-JUL-18 | C | 87 | BROCCOLI | 23-JUL-18 | O | 75 | CHICKPEAS | 23-JUL-18 | C | 12 | CHICKPEAS | 23-JUL-18 | O | 10 | CHOCOLATE | 23-JUL-18 | C | 2000 | CHOCOLATE | 23-JUL-18 | O | 500 |
---|