В этой статье будет создана простая архитектура из трех связанных между собой таблиц внешними ключами.

optype Таблица-справочник типов операций, в ней будут храниться тип "Заказ" и "Возврат"
contractor Таблица-справочник контрагентов, в ней будут храниться поставщики.
operation Таблица операций, в ней будут отражаться заказы, возвраты и их детали.


Создаем таблицы:

  • Таблица-справочник типов операций, заполняем сразу двумя типами:
    create table optype as select 1 as id_optype ,'Заказ' as optype_name ,sysdate as create_date ,user as create_user from dual union all select 2 ,'Возврат' ,sysdate ,user from dual;
  • Таблица-справочник контрагентов, сразу генерируем 10 рандомных поставщиков:
    create table contractor as select level as id_contr ,'ООО '||dbms_random.string('u',1)||dbms_random.string('l',7) as contr_name ,sysdate create_date ,user create_user from dual connect by level <= 10;
  • Чтобы исключить ошибку ORA-02270: для этого списка-столбца нет подходящего уникального или первичного ключа при создании внешних ключей, создадим для наших таблиц-справочников (optype и contractor) первичные ключи, что будет гарантировать уникальные значения внешнего ключа.
    alter table optype add constraint pk_id_optype primary key(id_optype); alter table contractor add constraint pk_id_contr primary key(id_contr);
  • Таблица операций с внешними ключами:
    create table operation (id_oper number generated by default as identity --автоматич. генерация первичного ключа ,op_num varchar2(50 char) --номер операции ,op_sum number -- сумма операции ,op_date date -- дата операции ,id_optype number -- ссылка на optype ,id_contr number --ссылка на contractor ,create_date timestamp default systimestamp --дата создания строки ,create_user varchar2(20 char) default user --пользователь создавший строку ,constraint fk_id_optype foreign key (id_optype) references optype(id_optype) --создаем связь с таблицей "Тип операции" ,constraint fk_id_contr foreign key (id_contr) references contractor(id_contr)); --создаем связь с таблицей "Контрагенты"

Структура создана, теперь необходимо наполнить таблицу operation данными, для этого нужно просто выполнить скрипт ниже:
Примечание: чтобы исключить ошибку ORA-30009: Недостаточно памяти для операции CONNECT BY добавление будет осуществляться пачками не более 500 000 строк, чтобы избежать переполнения памяти PGA.

declare v_row_count number := 10000000; --кол-во строк v_batch number := 500000; --максимальный размер пачки begin --начало цикла loop --если кол-во строк меньше пачки, --то размер пачки = кол-во строк --иначе размер пачки не более максимального. if v_row_count < v_batch then v_batch := v_row_count; end if; insert /*+ no_append*/ into operation (op_num ,op_sum ,op_date ,id_optype ,id_contr) select dbms_random.string('u',7)||to_char(round(dbms_random.value(1,1000000))) as op_num ,round(dbms_random.value(100,500000),2) as order_sum ,to_date(to_char(round(dbms_random.value(1,28))) ||'.' ||to_char(round(dbms_random.value(1,12))) ||'.' ||'2020') as order_date ,round(dbms_random.value(1,2)) as id_optype ,round(dbms_random.value(1,10)) as id_contr from dual connect by level <= v_batch; --размер пачки --уменьшаем кол-во строк на размер пачки --чтобы знать сколько еще нужно сгенерировать v_row_count := v_row_count - v_batch; --выходим из цикла, кол-во строк = 0 exit when v_row_count <= 0; end loop; --фиксируем изменения commit; end;

Готово, создание тестовой среды завершено. Теперь можно писать программы и тестировать их.


Спасибо за внимание!