Oracle вставить и заменить значение на значение первичного ключа из другой таблицы - PullRequest
1 голос
/ 03 апреля 2020

У меня есть две таблицы.

TABLE2 имеет поля CODE_NM и DESCRIPTION. CODE_NM является первичным ключом в этой таблице и внешним ключом в TABLE1 для этой таблицы.

TABLE2:

|---------------------|------------------|
|      CODE_NM        |     DESCRIPTION  |
|---------------------|------------------|
|          001        |description 1 text|
|---------------------|------------------|
|          002        |description 2 text|
|---------------------|------------------|

TABLE1:

|---------------------|----------------------|------------------|
|      CODE_NM        |  DESCRIPTION_DETAIL  |      USER        |
|---------------------|----------------------|------------------|
|          001        |  some text in here   |      USERID      |
|---------------------|----------------------|------------------|

Каждый раз, когда строка добавляется в TABLE1, пользователь вводит DESCRIPTION , DESCRIPTION_DETAIL и USER. С каждой вставкой я хочу заменить ОПИСАНИЕ на CODE_NM. Несомненно, что для любого вставленного ОПИСАНИЯ будет значение для него со связанным с ним первичным ключом в ТАБЛИЦЕ 2.

Так что я должен иметь возможность вставить:

INSERT INTO TABLE1 (CODE_NM, DESCRIPTION_DETAIL, USER)
VALUES ('description 1 text','this it the situation','USERID');

и вместо «текст описания 1», я хочу отобразить первичный ключ, который является «001»:

|---------------------|----------------------|------------------|
|      CODE_NM        |  DESCRIPTION_DETAIL  |      USER        |
|---------------------|----------------------|------------------|
|          001        |  some text in here   |      USERID      |
|---------------------|----------------------|------------------|

Можно ли это сделать с помощью триггера?

Ответы [ 3 ]

3 голосов
/ 04 апреля 2020

Вы можете создать такой триггер перед вставкой для table1:

SQL> create or replace trigger trg_tbl1_bi
  before insert on table1   
  for each row    
declare
  begin
     select code_nm
       into :new.code_nm 
       from table2 
      where trim(description) = trim(:new.code_nm);
   exception when no_data_found then 
      raise_application_error(-20001,'No matching record found!');  
  end;  
end;
/

, но вам необходимо точное соответствие между этими строками (значения столбца table2.description и :new.code_nm of table1)

0 голосов
/ 04 апреля 2020

Вот что получилось:

create or replace trigger trigger_name
before insert on TABLE1
FOR EACH ROW
DECLARE
   v_code_nm table2.code_nm%type;
begin
 SELECT code_nm INTO v_code_nm FROM TABLE2 WHERE DESCRIPTION=:new.code_nm;
  :new.code_nm := v_code_nm;
end;
0 голосов
/ 03 апреля 2020

Вы можете создать триггер

create or replace trigger tbi_table2
before insert on table2
on each row
declare
begin
  :new.code_nm := select code_nm from table1 where description=:new.code_nm;
end;
...