FOR v_i IN 1..vt_all_executors.COUNT LOOP
IF NOT vt_executor_total_work_count.EXISTS(vt_all_executors(v_i)) THEN
RETURN vt_all_executors(v_i);
END IF;
END LOOP;
下午好。这是一段代码,用于精确选择所需的ID并通过RETURN函数输出值(第一个)。问题是如何使其随机选择此ID。我知道函数dbms_random
,但是我仍然没有如何在经验中应用它。
如有必要-这是完整的请求-https://pastebin.com/EsdXAd3p
答案 0 :(得分:1)
以下代码返回0到10000000之间的随机数,不带小数位:
FOR v_i IN 1..vt_all_executors.COUNT LOOP
IF NOT vt_executor_total_work_count.EXISTS(vt_all_executors(v_i)) THEN
RETURN ROUND(DBMS_RANDOM.value(0, 10000000));
END IF;
END LOOP;
如果需要在可能的输出中包括小数位,请删除ROUND函数。 如果需要其他可能的最小值或最大值,请将输入值更改为DBMS_RANDOM.value(min,max)函数。
另一方面,如果您需要从其中一个 vt_all_executors 值中返回随机值,那么您将需要以下内容:
-- piece of code before the loop
SELECT MAX(rwn)
INTO v_random_max
FROM (SELECT aex.column_value AS user_id,
ROW_NUMBER() OVER (ORDER BY aex.column_value) rwn
FROM TABLE(vt_all_executors) aex );
FOR v_i IN 1..vt_all_executors.COUNT LOOP
IF NOT vt_executor_total_work_count.EXISTS(vt_all_executors(v_i)) THEN
v_random_chosen := ROUND(DBMS_RANDOM.value(1, v_random_max + 1));
SELECT user_id
INTO v_random_return
FROM (-- same inner select as before the loop, with the same order by
SELECT aex.column_value AS user_id,
ROW_NUMBER() OVER (ORDER BY aex.column_value) rwn
FROM TABLE(vt_all_executors) aex )
WHERE rwn = v_random_chosen;
RETURN v_random_return;
END IF;
END LOOP;
在第二个代码示例中,我正在将vt_all_executors的每个值都连接到一个数字。最小的vt_all_executors值附加到数字1,然后附加到数字2,依此类推,最大的vt_all_executors值附加到v_random_max)。
然后,我选择一个介于1(最小的vt_all_executors值)和v_random_max(最大的vt_all_executors值)之间的随机值,因为我无法直接连接到它们(因为这些vt_all_executors值之间存在间隙)。
因此,将确切的vt_all_executors值附加到数字后,我将收集该确切的vt_all_executors值,并使用 RETURN v_random_return 返回。