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

时间:2015-03-04 15:17:59

标签: sql oracle reference insert cursor

我有这个问题:

我有3个表 - RL_EST_SH (ID,PARTY_ID), PARTY (ID), COMM_PROP (PARTY_ID,PERSID1,PERSID2)表有其他专栏,但它们无关紧要。

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

比我有一个查询,选择返回我的结果集(仅显示前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创建新的Party(表Party中的ID),将此新ID分配给RL_EST_SH中的PARTY_ID列以查找来自查询的ID并在COMM_PROP中创建新记录 - 通过PARTY_ID保持REAL_ESTATE_SHARE_ID的所有者的记录。

为了更好地理解这里是简单的画: enter image description here

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

2 个答案:

答案 0 :(得分:0)

由于您必须对一个表进行更新并插入另外两个表,因此您必须使用PL / SQL。

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

如果所有表都是空的,您可以在单个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;

答案 1 :(得分:0)

嗯,这就是我现在的程度......

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 - 此行中的“唯一约束(%s。%s)违反”:

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

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