oracle集合的最短日期

oracle集合的最短日期,oracle,collections,plsql,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

我的收藏是这样的:

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

我怎么做


请帮忙。

我试着复制上面提到的场景。我们可以对循环进行一些调整,然后我们得到输出。Tis不是最优化的代码,但它适用于小数据集。希望这有帮助

SET serveroutput ON;
DECLARE
type LV_OBJ
IS
  record
  (
    SR NUMBER,
    DT DATE );
type LV_DATE
IS
  TABLE OF LV_OBJ INDEX BY PLS_INTEGER;
  LV_TAB LV_DATE;
  LV_LEAST DATE;
  LV_VAR   VARCHAR2(1000);
BEGIN
  SELECT LEVEL,
    sysdate+level DT bulk collect
  INTO LV_TAB
  FROM DUAL
    CONNECT BY LEVEL < 10;
  FOR I IN LV_TAB.first..LV_TAB.last
  LOOP
    LV_VAR:=LV_VAR||','''||LV_TAB(I).DT||'''';
  END LOOP;
  EXECUTE immediate 'SELECT LEAST('||SUBSTR(LV_VAR,2,LENGTH(LV_VAR))||') FROM DUAL' INTO LV_LEAST;
  dbms_output.put_line(LV_LEAST);
END;

还有一些需要思考的问题:

按字符串创建集合索引

使用日期循环遍历集合,并将该日期用作字符串索引集合中的索引值。完成后的.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;
/

该数组是一个关联数组,可以是稀疏的-如果是这种情况,则不能从第一个循环到最后一个循环。此外,您真的不需要动态SQL!是的,我忘了添加以检查该索引中的元素是否存在。在这种情况下应该使用EXISTS来检查Yeaah同意在这种情况下我们不需要动态SQL。使用EXISTS和FOR循环不是一个好的解决方案,因为您可以将一个元素的索引为0,另一个元素的索引为1000000,然后您将执行1000001次迭代,而您只需要使用下一个运算符执行2。明白了。非常感谢:您能做的最好的方式是按asc日期订购正在填充集合的数据。然后,您可以始终选择集合的第一个值,即最短日期。您如何填充集合?用一个选择。。。批量收款声明?
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;
/