Oracle 用于生成随机数据的SQL语句

Oracle 用于生成随机数据的SQL语句,oracle,oracle11g,Oracle,Oracle11g,我有一个Oracle表,我想用随机数据填充它: CREATE TABLE AGENT_HISTORY( EVENTID INTEGER NOT NULL, AGENTID INTEGER NOT NULL, EVENT_DATE DATE, CPU INTEGER, RAM NUMBER, HDD NUMBER, NETWORK_UP NUMBER, NETWORK_DOWN NUMBER ) / -- CREATE INDEXES FOR TABLE AGEN

我有一个Oracle表,我想用随机数据填充它:

CREATE TABLE AGENT_HISTORY(
  EVENTID INTEGER NOT NULL,
  AGENTID INTEGER NOT NULL,
  EVENT_DATE DATE,
  CPU INTEGER,
  RAM NUMBER,
  HDD NUMBER,
  NETWORK_UP NUMBER,
  NETWORK_DOWN NUMBER
)
/

-- CREATE INDEXES FOR TABLE AGENT_HISTORY

CREATE INDEX IX_RELATIONSHIP1 ON AGENT_HISTORY (AGENTID)
/

-- ADD KEYS FOR TABLE AGENT_HISTORY

ALTER TABLE AGENT_HISTORY ADD CONSTRAINT KEY8 PRIMARY KEY (EVENTID)
/

如何生成60天后列事件日期的随机数据?例如,每天我都想插入一些随机网络流量数据?

使用下面的pl/sql块生成随机数据,它也会插入到您的表中

INSERT INTO AGENT_HISTORY (EVENTID, AGENTID, EVENT_DATE, CPU, RAM, HDD, NETWORK_UP, NETWORK_DOWN)
SELECT LEVEL, LEVEL, TRUNC(SYSDATE - LEVEL + 1), DBMS_RANDOM.VALUE * 100, DBMS_RANDOM.VALUE, DBMS_RANDOM.VALUE, DBMS_RANDOM.VALUE, DBMS_RANDOM.VALUE
FROM DUAL CONNECT BY LEVEL <= 60;
    declare 
      v_EVENTID INTEGER;
      v_AGENTID INTEGER:=1;
      v_EVENT_DATE  DATE:=sysdate-60; 
      v_CPU INTEGER;
      v_RAM NUMBER;
      v_HDD NUMBER;
      v_NETWORK_UP NUMBER;
      v_NETWORK_DOWN NUMBER;
    begin 
    for i in 1..100
    loop
    v_EVENT_DATE:=v_EVENT_DATE-1;
    select i,ceil(dbms_random.value(1,1000)),floor(dbms_random.value(1,1000)),ceil(dbms_random.value(1,100))*2,floor(dbms_random.value(1,100))*2,100+i
     into v_EVENTID,v_CPU,v_ram,v_HDD,v_NETWORK_UP,v_NETWORK_DOWN    from dual;
    --insert into AGENT_HISTORY values(v_EVENTID,v_AGENTID,v_EVENT_DATE,v_CPU,v_ram,v_HDD,v_NETWORK_UP,v_NETWORK_DOWN);
dbms_output.put_line(v_EVENTID||' '||v_AGENTID||' '||v_EVENT_DATE||' '||v_CPU||' '||v_ram||' '||v_HDD||' '||v_NETWORK_UP||' '||v_NETWORK_DOWN) ;
    end loop;
    end;

使用下面的pl/sql块生成随机数据,并将其插入到表中

    declare 
      v_EVENTID INTEGER;
      v_AGENTID INTEGER:=1;
      v_EVENT_DATE  DATE:=sysdate-60; 
      v_CPU INTEGER;
      v_RAM NUMBER;
      v_HDD NUMBER;
      v_NETWORK_UP NUMBER;
      v_NETWORK_DOWN NUMBER;
    begin 
    for i in 1..100
    loop
    v_EVENT_DATE:=v_EVENT_DATE-1;
    select i,ceil(dbms_random.value(1,1000)),floor(dbms_random.value(1,1000)),ceil(dbms_random.value(1,100))*2,floor(dbms_random.value(1,100))*2,100+i
     into v_EVENTID,v_CPU,v_ram,v_HDD,v_NETWORK_UP,v_NETWORK_DOWN    from dual;
    --insert into AGENT_HISTORY values(v_EVENTID,v_AGENTID,v_EVENT_DATE,v_CPU,v_ram,v_HDD,v_NETWORK_UP,v_NETWORK_DOWN);
dbms_output.put_line(v_EVENTID||' '||v_AGENTID||' '||v_EVENT_DATE||' '||v_CPU||' '||v_ram||' '||v_HDD||' '||v_NETWORK_UP||' '||v_NETWORK_DOWN) ;
    end loop;
    end;

如果您希望代码具有过程生成的感觉,而不需要实际切换到PL/SQL上下文,那么可以使用子句生成数据

INSERT INTO agent_history (EVENTID, AGENTID, EVENT_DATE, CPU, RAM, HDD, NETWORK_UP, NETWORK_DOWN)
SELECT EVENTID, AGENTID, EVENT_DATE, CPU, RAM, HDD, NETWORK_UP, NETWORK_DOWN
FROM agent_history
MODEL DIMENSION BY (0 ITERATION)
      MEASURES (EVENTID, AGENTID, EVENT_DATE, CPU, RAM, HDD, NETWORK_UP, NETWORK_DOWN)
      RULES ITERATE (60) ( --Or however many days you want to iterate over
        EVENTID[ITERATION_NUMBER]      = 100-ITERATION_NUMBER,              
        AGENTID[ITERATION_NUMBER]      = 1,                                 
        EVENT_DATE[ITERATION_NUMBER]   = TRUNC(SYSDATE-ITERATION_NUMBER+1), 
        CPU[ITERATION_NUMBER]          = ceil(dbms_random.value(1,100)),
        RAM[ITERATION_NUMBER]          = floor(dbms_random.value(1,100)),
        HDD[ITERATION_NUMBER]          = ceil(DBMS_RANDOM.VALUE * 100),
        NETWORK_UP[ITERATION_NUMBER]   = DBMS_RANDOM.VALUE * 100+1,
        NETWORK_DOWN[ITERATION_NUMBER] = DBMS_RANDOM.VALUE * ITERATION_NUMBER
      )
ORDER BY EVENT_DATE;

如果您希望代码具有过程生成的感觉,而不需要实际切换到PL/SQL上下文,那么可以使用子句生成数据

INSERT INTO agent_history (EVENTID, AGENTID, EVENT_DATE, CPU, RAM, HDD, NETWORK_UP, NETWORK_DOWN)
SELECT EVENTID, AGENTID, EVENT_DATE, CPU, RAM, HDD, NETWORK_UP, NETWORK_DOWN
FROM agent_history
MODEL DIMENSION BY (0 ITERATION)
      MEASURES (EVENTID, AGENTID, EVENT_DATE, CPU, RAM, HDD, NETWORK_UP, NETWORK_DOWN)
      RULES ITERATE (60) ( --Or however many days you want to iterate over
        EVENTID[ITERATION_NUMBER]      = 100-ITERATION_NUMBER,              
        AGENTID[ITERATION_NUMBER]      = 1,                                 
        EVENT_DATE[ITERATION_NUMBER]   = TRUNC(SYSDATE-ITERATION_NUMBER+1), 
        CPU[ITERATION_NUMBER]          = ceil(dbms_random.value(1,100)),
        RAM[ITERATION_NUMBER]          = floor(dbms_random.value(1,100)),
        HDD[ITERATION_NUMBER]          = ceil(DBMS_RANDOM.VALUE * 100),
        NETWORK_UP[ITERATION_NUMBER]   = DBMS_RANDOM.VALUE * 100+1,
        NETWORK_DOWN[ITERATION_NUMBER] = DBMS_RANDOM.VALUE * ITERATION_NUMBER
      )
ORDER BY EVENT_DATE;


您必须使用dbms_随机包来生成随机数。60天过去意味着什么?以及您必须生成多少行??我需要60个事件或60天以前的更多事件。是否要为所有列随机生成数据??仅为AGENTID我需要始终为值1。为表结构器提供诸如唯一键、主键等约束您必须使用dbms_随机包生成随机数。60天过去意味着什么?以及您必须生成多少行??我需要60个事件或60天以前的更多事件。是否要为所有列随机生成数据??仅为AGENTID我需要始终为值1。为表结构器提供诸如唯一键、主键等约束。我更新了帖子。列AGENTID始终具有值1I get Error report-ORA-06550:第18行,第13列:PL/SQL:ORA-00942:表或视图不存在ORA-06550:第18行,第1列:PL/SQL:SQL语句被忽略06550。00000-行%s,列%s:\n%s*原因:通常是PL/SQL编译错误*操作:请检查我已更新的最新pl/sql块。我错过了ram列,这就是为什么我们得到错误:我得到错误报告-ORA-00001:unique constraint ADMIN.KEY8在第16 00001行违反了ORA-06512:。00000-违反了唯一约束%s.%s*原因:UPDATE或INSERT语句试图插入重复的密钥。对于在DBMS MAC模式下配置的受信任Oracle,如果在不同级别存在重复条目,则可能会看到此消息*操作:删除唯一限制或不插入密钥。我再次编辑了pl/sql块,请检查一次。我更新了帖子。列AGENTID始终具有值1I get Error report-ORA-06550:第18行,第13列:PL/SQL:ORA-00942:表或视图不存在ORA-06550:第18行,第1列:PL/SQL:SQL语句被忽略06550。00000-行%s,列%s:\n%s*原因:通常是PL/SQL编译错误*操作:请检查我已更新的最新pl/sql块。我错过了ram列,这就是为什么我们得到错误:我得到错误报告-ORA-00001:unique constraint ADMIN.KEY8在第16 00001行违反了ORA-06512:。00000-违反了唯一约束%s.%s*原因:UPDATE或INSERT语句试图插入重复的密钥。对于在DBMS MAC模式下配置的受信任Oracle,如果在不同级别存在重复条目,则可能会看到此消息*操作:删除唯一限制或不插入密钥。我再次编辑了pl/sql块,请检查一次。