2017-03-08 16 views
0

私のコレクションであるOracleコレクションを形成pl/sqlブロックを使用してv_cltbs_account_comp_sch.due_dateからの最小日。最小日付のよう

どうすればいいですか?

助けてください。

+0

あなたが私を行うことができます最善の方法asc'日のコレクションを移入されたデータによる 'ために。そして、あなたはいつでも最も少ない日であるコレクションの最初の値を選ぶことができます – XING

+0

コレクションにどのようにデータを埋め込みますか? SELECT ... BULK COLLECT文を使用していますか? – APC

答えて

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; 
/
0

私は上記のようなテンポを再現しようとしました。私たちはループの周りにいくつかの微調整を行うことができ、われわれは出力を得る。 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; 
+0

配列は連想配列であり、スパースである可能性があります。この場合、 'FIRST'から' LAST'までループすることはできません。また、あなたは本当にこれのために動的SQLを必要としません! – MT0

+0

そのインデックスの要素が存在するかどうかをチェックするために追加することを忘れました。この場合EXISTSを使用して –

+0

を確認してください。この場合、動的SQLが必要ないとYeaahは同意しました。 –

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; 
関連する問題