Oracle PLSQL游标函数



我有以下函数。

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:如果你需要更多信息,请告诉我。然而,在函数代码中有一个链接到原始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,其中可能包含以下值:

AC
A14
A210
A32
A410

最新更新