Når du opretter en opslagstabel i SQL Workshop, genererer APEX adskillige DDL- og DML-sætninger for at udføre jobbet. I det sidste trin i guiden skulle du kunne udvide SQL-regionen nederst for at se koden. Desværre kommer det ikke velformateret ud, men det er ikke for svært at rydde op.
Som en test gik jeg ind og lavede en opslagstabel på JOB-kolonnen i EMP-tabellen. Her er koden, der blev genereret. Jeg har formateret det og tilføjet kommentarer for at forklare de dele, du skal bruge, og dem du ikke vil.
/*
* 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");
Med hensyn til insert-sætningen, der udfylder opslagstabellen, er her den modificerede version, du skal bruge:
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
);
Det sikrer, at kun nye, unikke værdier tilføjes til opslagstabellen.