sql >> Databasteknik >  >> RDS >> Oracle

Oracle APEX - Uppslagstabell med flera länkar

När du skapar en uppslagstabell i SQL Workshop, genererar APEX flera DDL- och DML-satser för att göra jobbet. I det sista steget i guiden bör du kunna expandera SQL-regionen längst ner för att se koden. Tyvärr kommer det inte ut välformaterat, men det är inte så svårt att rensa upp.

Som ett test gick jag in och skapade en uppslagstabell i JOB-kolumnen i EMP-tabellen. Här är koden som skapades. Jag har formaterat den och lagt till kommentarer för att förklara de delar du behöver och de du inte behöver.

/*
* 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");

När det gäller infogningssatsen som fyller i uppslagstabellen, här är den modifierade versionen du behöver:

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 säkerställer att endast nya, unika värden läggs till i uppslagstabellen.




  1. Varför ignorerar Oracle index med ORDER BY?

  2. Ska en databasanslutning vara öppen hela tiden eller bara öppnas när det behövs?

  3. Kul med meddelanden

  4. Konvertera unix tidsstämpel till Datum och DateTime - SQL/ORACLE