【问题标题】:How to select a random value from a collection in PL/SQL?如何从 PL/SQL 中的集合中选择一个随机值?
【发布时间】:2022-01-03 20:07:43
【问题描述】:

我有一个充满数据的集合 如何从中选择随机数据?

declare
TYPE r_emp_id IS TABLE OF NUMBER;
    emps r_emp_id;
begin
select employes_id into emps from employes order by employes_id;

for i in <(random number of employes_id from emps)> loop

DBMS_OUTPUT.put_line(employes_id (i)); 
end loop;
end;

【问题讨论】:

  • table of number 是嵌套表类型,而不是关联数组。 table of number index by pls_integer 将是一个关联数组;你的代码中没有类似的东西。请澄清。

标签: sql oracle random plsql


【解决方案1】:

您想BULK COLLECT INTO 一个集合,然后如果您只想要一个随机值,则不需要循环:

DECLARE
  TYPE r_emp_id IS TABLE OF NUMBER;
  emps r_emp_id;
  i    PLS_INTEGER;
BEGIN
  SELECT employes_id
  BULK COLLECT INTO emps
  FROM   employes
  ORDER BY employes_id;

  i := FLOOR(DBMS_RANDOM.VALUE(1, emps.COUNT + 1));

  DBMS_OUTPUT.put_line(emps(i)); 
END;
/

如果您希望所有值按随机顺序排列,则:

DECLARE
  TYPE r_emp_id IS TABLE OF NUMBER;
  emps r_emp_id;
BEGIN
  SELECT employes_id
  BULK COLLECT INTO emps
  FROM   employes
  ORDER BY DBMS_RANDOM.VALUE;

  FOR i IN 1 .. emps.COUNT LOOP
    DBMS_OUTPUT.put_line(emps(i)); 
  END LOOP;
END;
/

但是,对于单个值,您可以完全跳过集合:

DECLARE
  emp_id EMPLOYES.EMPLOYES_ID%TYPE;
BEGIN
  SELECT employes_id
  INTO   emp_id
  FROM   employes
  ORDER BY DBMS_RANDOM.VALUE
  FETCH FIRST ROW ONLY;

  DBMS_OUTPUT.put_line(emp_id); 
END;
/

或者,在 SQL(而不是 PL/SQL)中:

SELECT employes_id
FROM   employes
ORDER BY DBMS_RANDOM.VALUE
FETCH FIRST ROW ONLY;

db小提琴here

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2011-10-22
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2018-07-23
    相关资源
    最近更新 更多