【发布时间】:2022-01-02 14:26:22
【问题描述】:
CREATE TABLE new_details_staging
(
e_id NUMBER(10),
e_name VARCHAR2(30),
portal_desc VARCHAR2(50),
risk_dec VARCHAR2(50),
CONSTRAINT pk_new_details_staging PRIMARY KEY (e_id)
);
INSERT INTO new_details_staging
VALUES (11, 'A', 'AA', 'High');
INSERT INTO new_details_staging
VALUES (22, 'B', 'BB', 'Low');
CREATE TABLE lookup_ref
(
ref_id NUMBER(10),
ref_typ VARCHAR2(30),
ref_typ_desc VARCHAR2(20),
CONSTRAINT pk_lookup_ref PRIMARY KEY (ref_id)
);
INSERT INTO lookup_ref
VALUES (181, 'portal', 'AA');
INSERT INTO lookup_ref
VALUES (182, 'portal', 'BB');
INSERT INTO lookup_ref
VALUES (183, 'risk', 'High');
INSERT INTO lookup_ref
VALUES (184, 'risk', 'Low');
CREATE TABLE new_details_main
(
e_id NUMBER(10),
e_name VARCHAR2(30),
portal NUMBER(20),
risk NUMBER(20),
CONSTRAINT pk_new_details_main PRIMARY KEY (e_id)
);
COMMIT;
存储过程
我想通过这个存储过程将记录从暂存中插入到主表中。
create or replace procedure sp_main(ov_err_msg OUT varchar2)
is
begin
INSERT INTO new_details_main (e_id, e_name, portal, risk)
SELECT n.e_id
, n.e_name
, (
SELECT lp.ref_id
FROM lookup_ref lp -- lp is for Lookup-Portal
WHERE lp.ref_typ = 'portal'
AND lp.ref_typ_desc = n.portal_desc
),
(
SELECT lr.ref_id
FROM lookup_ref lr -- lr is for Lookup-Risk
WHERE lr.ref_typ = 'risk'
AND lr.ref_typ_desc = n.risk_dec
)
FROM new_details_staging n
;
end;
此过程为我提供了所需的确切结果,但如果将数据添加到同一 e_id 的暂存表中,则它应该更新主表中的记录,而不是插入新记录。例如,
如果我截断临时表并插入一个新行,其中风险为低,但这次它被更新为高
INSERT INTO new_details_staging
VALUES (22, 'B', 'BB', 'High');
所以,在我的主表中,应该只有 2 行,但对于 e_id 22,它应该已更新为 183。如何使用存储过程来实现这一点?
【问题讨论】: