2016-03-15 211 views
0

在我的代碼中,我試圖根據行號在for循環中插入數據。我想使用它的原因是因爲否則我得到一個「單行子查詢返回多個行」的錯誤,因爲我的select子查詢返回多於一行,實際上,顯然我想一次插入一行。在Oracle中使用ROWNUM插入行

declare 
begin 
for x in (select * from PilotKeyLookup) loop 
if x.p2id != null then 
insert into BridgeTable (groupid, pilotid) values (sqBridgeGroupID.nextval, (select p1id from PilotKeyLookup)); 
insert into BridgeTable (groupid, pilotid) values (sqBridgeGroupID.currval, (select p2id from PilotKeyLookup)); 
else 
insert into BridgeTable (groupid, pilotid) values (sqBridgeGroupID.nextval, (select p1id from PilotKeyLookup)); 
end if; 
end loop; 
end; 

而且這是我想使用的rownum:

declare 
begin 
for x in (select * from PilotKeyLookup) loop 
if x.p2id != null then 
insert into BridgeTable (groupid, pilotid) values (sqBridgeGroupID.nextval, (select p1id from PilotKeyLookup where rownum = x)); 
insert into BridgeTable (groupid, pilotid) values (sqBridgeGroupID.currval, (select p2id from PilotKeyLookup where rownum = x)); 
else 
insert into BridgeTable (groupid, pilotid) values (sqBridgeGroupID.nextval, (select p1id from PilotKeyLookup where rownum = x)); 
end if; 
end loop; 
end; 

不過,我得到一個「表達式類型錯誤」的錯誤。 有什麼建議嗎?

回答

1

你可能需要一個條件插入INSERT ... WHEN ... THEN,像這樣:

CREATE TABLE PilotKeyLookup(
    p1id int, p2id int 
); 

INSERT INTO PilotKeyLookup VALUES(5, null); 
INSERT INTO PilotKeyLookup VALUES(6, 7); 

CREATE TABLE BridgeTable(
    groupid int, pilotid int 
); 

CREATE SEQUENCE sqBridgeGroupID; 

INSERT 
    WHEN 1 = 1 THEN INTO BridgeTable(groupid, pilotid) 
        VALUES (sqBridgeGroupID.nextval, p1id) 
    WHEN p2id is not null THEN INTO BridgeTable(groupid, pilotid) 
        VALUES (sqBridgeGroupID.currval, p2id) 
SELECT * 
FROM PilotKeyLookup p; 



select * from BridgeTable; 

    GROUPID PILOTID 
---------- ---------- 
     1   5 
     2   6 
     2   7 
+0

這是一個不錯的解決方案! –

+0

謝謝,它像一個魅力。我決定選擇這個解決方案,因爲它似乎比下面的更快。 – Istvan

0

有兩個問題在你的代碼

1)使用x.p1id,而不是子查詢和

2)很抱歉,這x.p2id != null不起作用... **不是空的*必須使用!

這工作...

declare 
begin 
for x in (select * from PilotKeyLookup) loop 
if x.p2id is not null then 
insert into BridgeTable (groupid, pilotid) values (sqBridgeGroupID.nextval, x.p1id); 
insert into BridgeTable (groupid, pilotid) values (sqBridgeGroupID.currval, x.p2id); 
else 
insert into BridgeTable (groupid, pilotid) values (sqBridgeGroupID.nextval, x.p1id); 
end if; 
end loop; 
end; 

...但你應該明確地使用一個解決方案,而遊標循環在其他答案提出的。

作爲一個exersize,您可以將兩種方法的執行情況與一些非平凡的數據量進行比較,您會看到爲什麼避免循環(如果可能)是一個好主意。

+0

謝謝,它也可以工作,但是我選擇了上面沒有循環的解決方案,因爲這似乎工作得更快。 – Istvan

+0

這絕對是正確的選擇。我只記錄如何**不正確地做** –