Когато създавате справочна таблица в SQL Workshop, APEX генерира няколко DDL и DML оператора, за да свърши работата. В последната стъпка на съветника трябва да можете да разширите SQL региона в долната част, за да видите кода. За съжаление не излиза добре форматирано, но не е много трудно да се изчисти.
Като тест влязох и създадох справочна таблица в колоната JOB на таблицата EMP. Ето кода, който беше генериран. Форматирах го и добавих коментари, за да обясня частите, от които ще имате нужда, и тези, които не.
/*
* Creates the lookup table. Not needed after the first pass.
*/
create table "JOB_LOOKUP"(
"JOB_ID" number not null primary key,
"JOB" varchar2(4000) not null
);
/*
* Creates the sequence for the primary key of the lookup table.
* Not needed after the first pass.
*/
create sequence "JOB_LOOKUP_SEQ";
/*
* Creates the trigger that links the sequence to the table.
* Not needed after the first pass.
*/
create or replace trigger "T_JOB_LOOKUP"
before insert or update on "JOB_LOOKUP"
for each row
begin
if inserting and :new."JOB_ID" is null then
for c1 in (select "JOB_LOOKUP_SEQ".nextval nv from dual) loop
:new."JOB_ID" := c1.nv; end loop; end if;
end;
/
/*
* Inserts the distinct values from the source table into the lookup
* table. If the lookup table already contains ALL of the needed values,
* country names in your case, then you can skip this step. However, if
* the source table has some values that are not in the lookup table, then
* you'll need to execute a modified version of this step. See notes below.
*/
insert into "JOB_LOOKUP" ( "JOB" )
select distinct "JOB" from "DMCGHANTEST"."EMP"
where "JOB" is not null;
/*
* The rest of the statements add the foreign key column, populate it,
* remove the old column, rename the new column, and add the foreign key.
* All of this is still needed.
*/
alter table "EMP" add "JOB2" number;
update "EMP" x set "JOB2" = (select "JOB_ID" from "JOB_LOOKUP" where "JOB" = x."JOB");
alter table "EMP" drop column "JOB";
alter table "EMP" rename column "JOB2" to "JOB_ID";
alter table "EMP" add foreign key ("JOB_ID") references "JOB_LOOKUP" ("JOB_ID");
Що се отнася до израза за вмъкване, който попълва справочната таблица, ето модифицираната версия, от която се нуждаете:
insert into "JOB_LOOKUP" ( "JOB" )
select distinct "JOB" from "DMCGHANTEST"."EMP"
where "JOB" is not null
and "JOB" not in (
select "JOB"
from JOB_LOOKUP
);
Това ще гарантира, че само нови, уникални стойности се добавят към справочната таблица.