Oracle PLSQL游标函数
我有下面的功能Oracle PLSQL游标函数,sql,oracle,plsql,Sql,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
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;
你能帮我了解一下这些线路的作用吗?在代码上加一行简短的解释就行了。谢谢
如果你需要更多的信息,请告诉我。但是,函数代码中有到原始SO问题的链接。用于1..t2\u data.count循环中的i
IF(t2_数据(i).a=cur.ay,t2_数据(i).c>0)
或者(cur.ay为NULL,t2_数据(i)。不是take和t2_数据(i)的成员。c>0)
然后
a_频率(i):=cum_频率+t2_数据(i).c;
cum_freq:=cum_freq+t2_数据(i.c);
其他的
a_-freqs(i):=cum_-freqs;
如果结束;
端环;
您有一个集合(数组)t2\u数据
,其中可能包含以下值:
A.
C
A1
4.
A2
10
A3
2.
A4
10
非常感谢您的精彩解释,我成功地完全理解了这段代码!好的,还有一个问题:如果两个表中都需要另一个链接变量来进行赋值,那么如果(t2_数据(i).a=cur.ay和t2_数据(i).c>0)或(cur.ay为NULL,t2_数据(i).a不是take和t2_数据(i.c>0)的成员,就足够了吗要包含这种关系吗?@jeiv我不确定我是否理解您提出的问题。假设我在表t1和表t2中有另一列名为PC(值为PC1,PC2…)。我必须为PC的每个分区运行分配逻辑。我该怎么做呢?这与这个问题的主题完全不同,但是
a_freqs(i) := cum_freq + t2_data(i).c;
cum_freq := cum_freq + t2_data(i).c;
ELSE
a_freqs(i) := cum_freq;