从查询中插入(+更新)到多个表而不丢失引用

inserting (+update) into multiple tables from query without losing reference

我有这个问题:

我有3个table-RL_EST_SH(ID,PARTY_ID),PARTY(ID), COMM_PROP(PARTY_ID,PERSID1,PERSID2) tables还有其他列,但不相关。

RL_EST_SH填充了ID,其他两个为空。

我有一个查询,select returns 我这个结果集(只显示前 10 行):

REAL_ESTATE_SHARE_ID        PERSON_ID1                     PERSON_ID2                  
"4000"                        "17839"                       "17838"                       
"41572"                       "47306"                       "47305"                       
"41573"                       "47306"                       "47305"                       
"41765"                       "47712"                       "47711"                       
"41757"                       "47714"                       "47713"                       
"41803"                       "47716"                       "47715"                       
"41903"                       "47718"                       "47717"                       
"41907"                       "47720"                       "47719"                       
"41910"                       "47720"                       "47719"                       
"41713"                       "47720"                       "47719"                       

此查询为我提供了 REAL_ESTATE_SHARE_ID

的两个所有者

现在我的问题是:

对于查询结果集中的每个 REAL_ESTATE_SHARE_ID,我需要使用序列 P0_PARTY_S 创建新的派对(ID 在 table 派对中),将这个新 ID 分配给 [= RL_EST_SH 中的 39=] 列用于查询 ID 并在 COMM_PROP 中创建新记录 - 保留 REAL_ESTATE_SHARE_ID 到 PARTY_ID 所有者的记录。

为了更好的理解这里简单画一下:

我不知道如何在不丢失参考的情况下执行此操作或如何立即执行此操作。我试图使用光标,但我没有足够的经验来这样做。我想这是正确的方法,但我不知道如何。

由于您必须更新一个 table 并插入另外两个,因此您必须使用 PL/SQL.

如果你不熟悉,你甚至不需要游标。只需在 SELECT 语句上创建一个 FOR LOOP 即可为您提供该结果集并执行 3 次操作(1 次更新和 2 次插入)。这样你就可以创建一个变量来存储序列的值,并在任意多的地方使用它。

如果所有 table 都是空的,您可以在单个 INSERT ALL 语句中完成此操作,看起来像这样 -

INSERT ALL
INTO RL_EST_SH(ID, PARTY_ID) VALUES (REAL_ESTATE_SHARE_ID, PARTY_ID)
INTO PARTY(ID) VALUES (PARTY_ID)
INTO COMM_PROP (PARTY_ID,PERSID1,PERSID2) VALUES (PARTY_ID, PERSON_ID1, PERSON_ID2)
SELECT PARTY_ID_SEQUENCE.NEXTVAL AS PARTY_ID, 
    REAL_ESTATE_SHARE_ID,
    PERSON_ID1,
    PERSON_ID2
FROM RESULTSET;

嗯,这就是我现在的情况...

declare 
REAL_ESTATE_SHARE_ID varchar2(19);
PERSON_ID1 VARCHAR2(19);
PERSON_ID2 VARCHAR2(19);
PERS_ID varchar2(19);
CURSOR C1 IS myquery;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO REAL_ESTATE_SHARE_ID, PERSON_ID1, PERSON_ID2;
EXIT WHEN C1%NOTFOUND;
PERS_ID := P0_PARTY_S.nextval;
INSERT INTO P0_PARTY VALUES (PERS_ID,0,sysdate,':party.Party:party.Person:',sysdate,2,null,'SJM',93407656999);
INSERT INTO P5_COMMUNITY_PROPERTY VALUES (P5_COMMUNITY_PROPERTY_S.nextval,'Y',PERS_ID,PERSON_ID1, PERSON_ID2);
UPDATE BIZZTST.R0_RL_EST_SHARE set PARTY_ID = PERS_ID where BIZZTST.R0_RL_EST_SHARE.ID = REAL_ESTATE_SHARE_ID;
END LOOP;
CLOSE C1;
END;

这导致了 `00001。 00000 - "unique constraint (%s.%s) violated" 在这一行:

INSERT INTO P5_COMMUNITY_PROPERTY VALUES (P5_COMMUNITY_PROPERTY_S.nextval,'Y',PERS_ID,PERSON_ID1, PERSON_ID2);

第三行有主键约束。有没有可能是我的代码有误,每次都插入相同的 ID? 我该如何解决? 还是我的整个代码都错了?