我的收藏就像:
TYPE ty_tb_v_cltbs_account_comp_sch
IS TABLE OF cltb_account_comp_sch%ROWTYPE
INDEX BY BINARY_INTEGER;
TYPE ty_cldaccnt IS RECORD (
v_cltbs_account_comp_sch ty_tb_v_cltbs_account_comp_sch);
从这个系列中,我可以访问v_cltbs_account_comp_sch.due_date
对于集合中的所有值,我想使用pl / sql块从v_cltbs_account_comp_sch.due_date
获取最小日期。
我该怎么做?
请帮忙。
答案 0 :(得分:1)
要考虑的其他事项:
按字符串创建集合索引。
使用日期循环访问您的集合,并将该日期用作字符串索引集合中的索引值。完成后的.FIRST索引值是最小日期。
我不是说这是最优化的方法,但我想提醒开发人员关于字符串索引的关联数组。你可以用它们做很多有趣的事情。
CREATE TABLE temptab
(
n NUMBER,
d DATE
)
/
BEGIN
FOR indx IN 1 .. 100
LOOP
INSERT INTO temptab
VALUES (indx, TRUNC (SYSDATE, 'YYYY') + DBMS_RANDOM.VALUE (1, 365));
END LOOP;
COMMIT;
END;
/
CREATE OR REPLACE PACKAGE collections
IS
TYPE rows_t IS TABLE OF temptab%ROWTYPE;
TYPE dates_t IS TABLE OF NUMBER
INDEX BY VARCHAR2 (100);
END;
/
DECLARE
l_rows collections.rows_t;
l_dates collections.dates_t;
l_min_date DATE;
BEGIN
SELECT *
BULK COLLECT INTO l_rows
FROM temptab;
FOR indx IN 1 .. l_rows.COUNT
LOOP
l_dates (TO_CHAR (l_rows (indx).d, 'YYYY-MM-DD')) := 0;
END LOOP;
DBMS_OUTPUT.put_line ('min date = ' || l_dates.FIRST);
END;
/
答案 1 :(得分:0)
我试图复制上面提到的te scenrio。我们可以围绕循环做一些调整,是的,我们得到了输出。 Tis不是最优化的代码,但它适用于小型数据集。希望这会有所帮助。
16px
答案 2 :(得分:0)
DECLARE
TYPE ty_tb_v_cltbs_account_comp_sch IS TABLE OF cltb_account_comp_sch%ROWTYPE INDEX BY BINARY_INTEGER;
TYPE ty_cldaccnt IS RECORD ( v_cltbs_account_comp_sch ty_tb_v_cltbs_account_comp_sch);
acct ty_cldaccnt;
min_date DATE;
i BINARY_INTEGER;
BEGIN
-- Populate the record
acct.v_cltbs_account_comp_sch(1).due_date := DATE '2017-05-01';
acct.v_cltbs_account_comp_sch(7).due_date := DATE '2017-02-01';
acct.v_cltbs_account_comp_sch(4).due_date := DATE '2017-04-01';
-- Loop to find the minimum
i := acct.v_cltbs_account_comp_sch.FIRST;
WHILE i IS NOT NULL LOOP
IF min_date IS NULL OR acct.v_cltbs_account_comp_sch(i).due_date < min_date THEN
min_date := acct.v_cltbs_account_comp_sch(i).due_date;
END IF;
i := acct.v_cltbs_account_comp_sch.NEXT(i);
END LOOP;
-- Output the minimum
DBMS_OUTPUT.PUT_LINE( min_date );
END;