私のコレクションであるOracleコレクションを形成pl/sqlブロックを使用してv_cltbs_account_comp_sch.due_date
からの最小日。最小日付のよう
どうすればいいですか?
助けてください。
私のコレクションであるOracleコレクションを形成pl/sqlブロックを使用してv_cltbs_account_comp_sch.due_date
からの最小日。最小日付のよう
どうすればいいですか?
助けてください。
について考える何か他のもの:
文字列でコレクションのインデックスを作成します。
日付を含むコレクションをループし、その日付を文字列インデックスコレクションのインデックス値として使用します。完了したときの.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;
/
私は上記のようなテンポを再現しようとしました。私たちはループの周りにいくつかの微調整を行うことができ、われわれは出力を得る。 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'から' LAST'までループすることはできません。また、あなたは本当にこれのために動的SQLを必要としません! – MT0
そのインデックスの要素が存在するかどうかをチェックするために追加することを忘れました。この場合EXISTSを使用して –
を確認してください。この場合、動的SQLが必要ないとYeaahは同意しました。 –
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;
あなたが私を行うことができます最善の方法asc'日のコレクションを移入されたデータによる 'ために。そして、あなたはいつでも最も少ない日であるコレクションの最初の値を選ぶことができます – XING
コレクションにどのようにデータを埋め込みますか? SELECT ... BULK COLLECT文を使用していますか? – APC