В этой статье будет создана простая архитектура из трех связанных между собой таблиц внешними ключами.
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;
Готово, создание тестовой среды завершено. Теперь можно писать программы и тестировать их.
Спасибо за внимание!
Вконтакте
Facebook
Twitter
Класснуть
Плюсануть
Читать еще: