最小日期形成oracle集合

时间:2017-03-08 06:10:01

标签: oracle collections plsql

我的收藏就像:

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获取最小日期。

我该怎么做?

请帮忙。

3 个答案:

答案 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;