簡體   English   中英

Oracle PLSQL cursor ZC1C425268E68385D1AB5074C17A94

[英]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語句匹配時,你增加累積頻率並將其存儲在累積頻率數組的下一個索引中,當它不匹配時你做不增加累積頻率並存儲與先前數組索引中存儲的頻率相同的頻率。


示例 1:

如果您正在處理的 cursor 行包含以下數據:

AY(是的,必須包括在內) AN(不,必須排除)
<NULL> A2,A4

那么頻率陣列將是:

a_freqs 筆記
4 不排除A1 ,因此累積頻率增加了t2_data中的相應值
4 A2被排除在外,所以暨。 頻率。 不改變。
6 A3不排除,所以暨。 頻率。 t2_data增加相應的值
6 A4被排除在外,所以暨。 頻率。 不改變。

算法的下一步將選擇一個隨機項目,直到最大累積頻率,並從t2_data中減少相應的C值,以指示該項目已被分配。 因此,如果第三個元素是隨機選擇的,那么它將在第一組中,這意味着A1在算法的下一階段遞減


示例 2:

如果您正在處理的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM