Oracle 插入值并将其替换为来自另一个 table 的主键值
Oracle insert and replace value with it's primary key value from another table
我有两个table。
TABLE2 有字段 CODE_NM 和 DESCRIPTION。 CODE_NM 是此 table 中的主键,也是此 table 的 TABLE1 中的外键。
表 2:
|---------------------|------------------|
| CODE_NM | DESCRIPTION |
|---------------------|------------------|
| 001 |description 1 text|
|---------------------|------------------|
| 002 |description 2 text|
|---------------------|------------------|
表 1:
|---------------------|----------------------|------------------|
| CODE_NM | DESCRIPTION_DETAIL | USER |
|---------------------|----------------------|------------------|
| 001 | some text in here | USERID |
|---------------------|----------------------|------------------|
每次向 TABLE1 插入一行时,用户将输入 DESCRIPTION、DESCRIPTION_DETAIL 和 USER。对于每个插入,我想用 CODE_NM 代替描述。
可以肯定的是,对于插入的任何 DESCRIPTION,在 TABLE2 中都会有一个值及其关联的主键。
所以我应该可以插入:
INSERT INTO TABLE1 (CODE_NM, DESCRIPTION_DETAIL, USER)
VALUES ('description 1 text','this it the situation','USERID');
而不是 'description 1 text',我想显示主键,即“001”:
|---------------------|----------------------|------------------|
| CODE_NM | DESCRIPTION_DETAIL | USER |
|---------------------|----------------------|------------------|
| 001 | some text in here | USERID |
|---------------------|----------------------|------------------|
这可以使用触发器来完成吗?
您可以创建触发器
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;
您可以为 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
的值)之间进行精确匹配
这是最终起作用的:
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;
我有两个table。
TABLE2 有字段 CODE_NM 和 DESCRIPTION。 CODE_NM 是此 table 中的主键,也是此 table 的 TABLE1 中的外键。
表 2:
|---------------------|------------------|
| CODE_NM | DESCRIPTION |
|---------------------|------------------|
| 001 |description 1 text|
|---------------------|------------------|
| 002 |description 2 text|
|---------------------|------------------|
表 1:
|---------------------|----------------------|------------------|
| CODE_NM | DESCRIPTION_DETAIL | USER |
|---------------------|----------------------|------------------|
| 001 | some text in here | USERID |
|---------------------|----------------------|------------------|
每次向 TABLE1 插入一行时,用户将输入 DESCRIPTION、DESCRIPTION_DETAIL 和 USER。对于每个插入,我想用 CODE_NM 代替描述。 可以肯定的是,对于插入的任何 DESCRIPTION,在 TABLE2 中都会有一个值及其关联的主键。
所以我应该可以插入:
INSERT INTO TABLE1 (CODE_NM, DESCRIPTION_DETAIL, USER)
VALUES ('description 1 text','this it the situation','USERID');
而不是 'description 1 text',我想显示主键,即“001”:
|---------------------|----------------------|------------------|
| CODE_NM | DESCRIPTION_DETAIL | USER |
|---------------------|----------------------|------------------|
| 001 | some text in here | USERID |
|---------------------|----------------------|------------------|
这可以使用触发器来完成吗?
您可以创建触发器
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;
您可以为 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
的值)之间进行精确匹配
这是最终起作用的:
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;