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;