从变量获取随机ID-Oracle

时间:2018-08-06 12:05:52

标签: sql oracle oracle11g

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

1 个答案:

答案 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 返回。