2015-11-10 6 views
0

Я хочу создать тестовые данные для этих таблиц Oracle:Генерация тестовых данных в таблицах Oracle

CREATE TABLE AGENT_HISTORY(
    EVENT_ID INTEGER NOT NULL, 
    AGENTID INTEGER NOT NULL, 
    EVENT_DATE DATE NOT NULL 
) 
/

CREATE TABLE CPU_HISTORY(
    CPU_HISTORY_ID INTEGER NOT NULL, 
    EVENT_ID INTEGER NOT NULL, 
    CPU_NAME VARCHAR2(50) NOT NULL, 
    CPU_VALUE NUMBER NOT NULL 
) 
/

Можете ли вы помочь мне создать процедуру для генерации случайных значений для 100 строк?

Я попробовал этот

BEGIN 

    FOR loop_counter IN 1..1000 
    LOOP 
    INSERT INTO AGENT_HISTORY (EVENT_ID, AGENTID, EVENT_DATE) 
    VALUES (loop_counter, 22, SYSDATE); 
    END LOOP; 

    COMMIT; 

    FOR loop_counter IN 1..1000 
    LOOP 
    INSERT INTO CPU_HISTORY_ID (CPU_HISTORY_ID, EVENT_ID, CPU_NAME, CPU_VALUE) 
    VALUES (loop_counter, loop_counter, 'cpu1', dbms_random.value(1,100)); 
    END LOOP; 

    COMMIT; 
END; 

Но я получаю эти ошибки:

Error report - 
ORA-00001: unique constraint (ADMIN.KEY8) violated 
ORA-06512: at line 5 
00001. 00000 - "unique constraint (%s.%s) violated" 
*Cause: An UPDATE or INSERT statement attempted to insert a duplicate key. 
      For Trusted Oracle configured in DBMS MAC mode, you may see 
      this message if a duplicate entry exists at a different level. 
*Action: Either remove the unique restriction or do not insert the key. 

Error report - 
ORA-06550: line 5, column 16: 
PL/SQL: ORA-00942: table or view does not exist 
ORA-06550: line 5, column 4: 
PL/SQL: SQL Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 
+1

Закрытие, потому что вам не нравится тот факт, что кто-то хочет код, это не повод для закрытия. –

+1

'INSERT INTO CPU_HISTORY_ID' удаляет' _ID', чтобы использовать имя таблицы 'CPU_HISTORY'. –

ответ

2

Надеется, что это помогает (см ниже работает SQLfiddle)

INSERT INTO AGENT_HISTORY (EVENT_ID,AGENTID,EVENT_DATE) 
select 
trunc(dbms_random.value(1,100)) EVENT_ID , 
trunc(dbms_random.value(1,100)) AGENTID , 
TO_DATE(
      TRUNC(
       DBMS_RANDOM.VALUE(TO_CHAR(DATE '2000-01-01','J') 
           ,TO_CHAR(DATE '2015-11-10','J') 
           ) 
       ),'J' 
      ) EVENT_DATE from dual 
connect by level <=10; 

select * from AGENT_HISTORY 

Рабочего SQL скрипка: http://sqlfiddle.com/#!4/2bcb6/7

+0

Вы уверены? Я не могу перечислить данные позже, когда просматриваю таблицу с помощью sqldeveloper –

+0

@ peter-penzov Исправлено. Одна строка кода ('insert ...') отсутствовала. Также теперь я улучшил 'dbms_random.value' и ввел более лучшую случайную дату. – user2314737

+0

Не могли бы вы показать мне вторую таблицу CPU_HISTORY, какой SQL-запрос мне нужно выполнить? –

0

Создайте PK последовательно (используя rownum), если вы хотите случайный порядок, добавьте опцию order by. Это избавит вас от дублированных ключей.

select 
    rownum CPU_HISTORY_ID, 
    trunc(dbms_random.value(1,50)) EVENT_ID, 
    'CPU NO '||trunc(dbms_random.value(1,10)) CPU_NAME, 
    dbms_random.value(1,5) CPU_VALUE 
from dual connect by level <= 100 
order by dbms_random.value() 
; 

Если внешний ключ прост, например. любое число от 1 до 50 использует генератор случайных чисел, как указано выше. Если у вас есть предопределенный набор возможных значений, используйте таблицу поиска. В приведенном ниже примере таблица EVENT отображает целое число 1..3 на возможные EVENT_ID, чтобы заполнить ограничения FK. Используйте аналогичный подход для своей таблицы событий.

with event as (
    select 1 rn, 1828 EVENT_ID from dual union all 
    select 2 rn, 2818 EVENT_ID from dual union all 
    select 3 rn, 9898 EVENT_ID from dual), 
gendata as ( 
select 
    rownum CPU_HISTORY_ID,round(dbms_random.value(1,3)) rn, 
    'CPU NO '||trunc(dbms_random.value(1,10)) CPU_NAME, 
    dbms_random.value(1,5) CPU_VALUE 
from dual connect by level <= 100 
) 
select CPU_HISTORY_ID, 
    (select EVENT_ID from event where rn = gendata.rn) EVENT_ID, 
    CPU_NAME, CPU_VALUE 
from gendata 
order by dbms_random.value() 
; 
Смежные вопросы