![](/img/trans.png)
[英]How to make a select from a cursor that returns from a plsql function ORACLE
[英]Oracle PLSQL cursor function
我有以下 function。
CREATE OR REPLACE FUNCTION pick_values RETURN t1_table
PIPELINED
IS
TYPE t2_type IS
TABLE OF t2%rowtype;
t2_data t2_type;
BEGIN
-- https://stackoverflow.com/a/67398434/1509264
-- License: CC BY-SA 4.0
SELECT
*
BULK COLLECT
INTO t2_data
FROM
t2;
FOR cur IN (
SELECT
*
FROM
t1
ORDER BY
r
) LOOP DECLARE
a_freqs int_list := int_list();
cum_freq INT := 0;
taken string_list := split_string(cur.an, ', ');
idx INT;
c t2.a%TYPE;
BEGIN
a_freqs.extend(t2_data.count);
FOR i IN 1..t2_data.count LOOP IF ( t2_data(i).a = cur.ay AND t2_data(i).c > 0 ) OR ( cur.ay IS NULL AND t2_data(i).a NOT
MEMBER OF taken AND t2_data(i).c > 0 ) THEN
a_freqs(i) := cum_freq + t2_data(i).c;
cum_freq := cum_freq + t2_data(i).c;
ELSE
a_freqs(i) := cum_freq;
END IF;
END LOOP;
IF cum_freq > 0 THEN
idx := floor(dbms_random.value(0, cum_freq));
FOR i IN 1..t2_data.count LOOP IF idx < a_freqs(i) THEN
c := t2_data(i).a;
t2_data(i).c := t2_data(i).c - 1;
EXIT;
END IF;
END LOOP;
END IF;
PIPE ROW ( t1_data(cur.vk, cur.ay, cur.an, cur.r, c) );
END;
END LOOP;
END;
但是,我很難理解以下幾行:
a_freqs(i) := cum_freq + t2_data(i).c;
cum_freq := cum_freq + t2_data(i).c;
ELSE
a_freqs(i) := cum_freq;
你能幫我看看這些線是做什么的嗎? 在代碼上加上一行簡短的解釋就可以了。 謝謝!
PD:如果您需要更多信息,請告訴我。 但是,在 function 代碼中有指向原始 SO 問題的鏈接。
FOR i IN 1..t2_data.count LOOP
IF ( t2_data(i).a = cur.ay AND t2_data(i).c > 0 )
OR ( cur.ay IS NULL AND t2_data(i).a NOT MEMBER OF taken AND t2_data(i).c > 0 )
THEN
a_freqs(i) := cum_freq + t2_data(i).c;
cum_freq := cum_freq + t2_data(i).c;
ELSE
a_freqs(i) := cum_freq;
END IF;
END LOOP;
您有一個集合(數組) t2_data
,其中可能包含以下值:
一個 | C |
---|---|
A1 | 4 |
A2 | 10 |
A3 | 2 |
A4 | 10 |
然后你有一個你正在填充的累積頻率數組並循環遍歷它們,當IF
語句匹配時,你增加累積頻率並將其存儲在累積頻率數組的下一個索引中,當它不匹配時你做不增加累積頻率並存儲與先前數組索引中存儲的頻率相同的頻率。
如果您正在處理的 cursor 行包含以下數據:
AY(是的,必須包括在內) | AN(不,必須排除) |
---|---|
<NULL> | A2,A4 |
那么頻率陣列將是:
a_freqs | 筆記 |
---|---|
4 | 不排除A1 ,因此累積頻率增加了t2_data 中的相應值 |
4 | A2 被排除在外,所以暨。 頻率。 不改變。 |
6 | A3 不排除,所以暨。 頻率。 從t2_data 增加相應的值 |
6 | A4 被排除在外,所以暨。 頻率。 不改變。 |
算法的下一步將選擇一個隨機項目,直到最大累積頻率,並從t2_data
中減少相應的C
值,以指示該項目已被分配。 因此,如果第三個元素是隨機選擇的,那么它將在第一組中,這意味着A1
在算法的下一階段遞減
如果您正在處理的 cursor 行包含以下數據:
AY(是的,必須包括在內) | AN(不,必須排除) |
---|---|
A3 | <NULL> |
那么頻率陣列將是:
a_freqs | 筆記 |
---|---|
0 | A1 不在必須包含的列表中,所以累積頻率保持在0 |
0 | A2 不在必須包含的列表中,所以 cum。 頻率。 停留在 0 |
2 | A3 在必須包含的列表中,所以 cum。 頻率。 從t2_data 增加相應的值 |
2 | A4 不在必須包含的列表中,所以暨。 頻率。 保持之前的值。 |
在這種情況下,只有一行累積頻率增加,因此只能分配A3
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.