如何通过 oracle 过程从现有数据库 table 生成 table 随机数据

how to generate a table of random data from existing database table through oracle procedure

我必须通过 oracle 过程从数据库 table 生成一个 table(包含两列)随机数据。用户可以指示所需数据的数量,我们必须使用 ID 值从 1001 到 1060 的 table 数据。我正在尝试使用游标循环,但不确定是否应该使用 dbms_random 方法。

我正在使用以下代码创建过程

create or replace procedure a05_random_plant(p_count in number)
as
v_count number := p_count;
cursor c is 
select plant_id, common_name
from ppl_plants
where rownum = v_count
order by dbms_random.value;
begin
delete from a05_random_plants_table;
for c_table in c
loop
insert into a05_random_plants_table(plant_id, plant_name)
                        values (c_table.plant_id, c_table.common_name);
end loop;
end;
/

符合要求。然后我用下面的代码执行

set serveroutput on
exec a05_random_plant(5);

显示匿名块已完成 但是当运行以下代码时,我没有得到任何记录

select * from a05_random_plants_table;

Tom Kyte 的查询 - 将生成近 75K 行:

select trunc(sysdate,'year')+mod(rownum,365) TRANS_DATE,
       mod(rownum,100) CUST_ID,
       abs(dbms_random.random)/100 SALES_AMOUNT
 from all_objects
/

您可以使用此示例编写查询并向其中添加 where 子句 - 例如,where id 介于 1001 和 1060 之间。

我认为您不应该使用游标(它自然很慢),而是从 select:

直接插入
insert into table (col1, col2)
select colx, coly from other_table...

而且,在您的过程结束时是否缺少 COMMIT?

因此,您的过程中的所有代码都将是一个 DELETE,一个 INSERT WITH SELECT,然后是一个 COMMIT。

rownum=value 不适用于大于 1 的值

因此请尝试以下

        create or replace procedure a05_random_plant(p_count in number)
        as
        v_count number := p_count;
        cursor c is 
        select plant_id, common_name
        from ppl_plants
        where rownum <= v_count
        order by dbms_random.value;
        begin
        delete from a05_random_plants_table;
        for c_table in c
        loop
        insert into a05_random_plants_table(plant_id, plant_name)
                                values (c_table.plant_id, c_table.common_name);
        end loop;
        end;
        /