2011-12-02 115 views
4

我試圖讓下面的SQL查詢工作,但我得到一個錯誤,我的問題是:SQL - 插入到表,如果在另一個表存在價值

我需要通過設置一個結果循環從選擇語句(這部分是好的)。在每一行的循環內,我需要檢查URL是否存在於tableA中。如果確實如此,則將映射插入到tableB中,否則將新行插入到tableC中。

這就是我所擁有的,但是當我嘗試執行時,我得到一條與IF中的錯誤說ORA-06550:第8行,第15列:PLS-00103:遇到符號「SELECT」下面:( - +案例國防部新的無.....

DECLARE 
STANDARD_LINK_ID TABLEB.LINK_ID%type; 

BEGIN 
     FOR LINK_ROW IN (SELECT LINKTEXT, LINKURL, CORPID FROM OLD_DATA) 
     LOOP 
      IF (SELECT COUNT(URL) FROM TABLEA WHERE URL = LINK_ROW.LINKURL) = 1 
      THEN 
      SELECT LINKID INTO STANDARD_LINK_ID FROM TABLEA WHERE URL = LINK_ROW.URL; 
      INSERT INTO TABLEB(LINK_ID, CORP_ID) 
      VALUES (STANDARD_LINK_ID, LINK_ROW.CORPID); 
      ELSE 
      INSERT INTO TABLEB(LINK_ID, LINK_NAME, URL, CORP_ID) 
      VALUES (SEQ_LINK.NEXTVAL, LINK_ROW.LINKTEXT, LINK_ROW.LINKURL, 
           LINK_ROW.CORP_ID); 
      END IF;     
     END LOOP; 
    COMMIT; 
END; 

回答

1

我見過它做這種方式,並不是用在條件

https://forums.oracle.com/forums/thread.jspa?threadID=177035

內嵌返回值的選擇
DECLARE 
STANDARD_LINK_ID TABLEB.LINK_ID%type; 
DECLARE W_LINK_COUNT NUMBER (1,0); 

BEGIN 
     FOR LINK_ROW IN (SELECT LINKTEXT, LINKURL, CORPID FROM OLD_DATA) 
     LOOP 
      SELECT COUNT(URL) INTO W_LINK_COUNT FROM TABLEA WHERE URL = LINK_ROW.LINKURL; 
      IF W_LINK_COUNT = 1 
      THEN 
      SELECT LINKID INTO STANDARD_LINK_ID FROM TABLEA WHERE URL = LINK_ROW.URL; 
      INSERT INTO TABLEB(LINK_ID, CORP_ID) 
      VALUES (STANDARD_LINK_ID, LINK_ROW.CORPID); 
      ELSE 
      INSERT INTO TABLEB(LINK_ID, LINK_NAME, URL, CORP_ID) 
      VALUES (SEQ_LINK.NEXTVAL, LINK_ROW.LINKTEXT, LINK_ROW.LINKURL, 
           LINK_ROW.CORP_ID); 
      END IF;     
     END LOOP; 
    COMMIT; 
END; 
2

我懷疑你的陳述是罪魁禍首,因爲你試圖達到的目標應該是可能的。你可以請嘗試以下代替:

DECLARE 
STANDARD_LINK_ID TABLEB.LINK_ID%type; 
URL_COUNT NUMBER(10); 

BEGIN 
     FOR LINK_ROW IN (SELECT LINKTEXT, LINKURL, CORPID FROM OLD_DATA) 
     LOOP 
      SELECT COUNT(URL) INTO URL_COUNT FROM TABLEA WHERE URL = LINK_ROW.LINKURL; 
      IF URL_COUNT = 1 THEN 
      SELECT LINKID INTO STANDARD_LINK_ID FROM TABLEA WHERE URL = LINK_ROW.URL; 
      INSERT INTO TABLEB(LINK_ID, CORP_ID) 
      VALUES (STANDARD_LINK_ID, LINK_ROW.CORPID); 
      ELSE 
      INSERT INTO TABLEB(LINK_ID, LINK_NAME, URL, CORP_ID) 
      VALUES (SEQ_LINK.NEXTVAL, LINK_ROW.LINKTEXT, LINK_ROW.LINKURL, 
           LINK_ROW.CORP_ID); 
      END IF;     
     END LOOP; 
    COMMIT; 
END; 

希望它可以幫助你找出問題所在。

2

我寫它的真快,但我認爲這兩個查詢將解決你的問題,而循環(這是比較慢,然後一次性插入):

-- insert to tableb when exists in tablea 
insert into tableb(link_id, corp_id) 
select a.linkid, o.corpid 
from old_data o 
join tablea a on o.url = a.url 


-- insert to tablec when not exists in tablea 
insert into tablec(link_id, link_name, url, corp_id) 
select seq_link.nextval, o.linktext, o.linkurl, o.corp_id 
from old_data o 
where not exists(select 1 from tablea a where o.url = a.url) 

PS。你不忘記tablecelse

+0

現在我來自不同的世界,但是如果它像我的世界一樣,集合操作比循環要快得多。不知道這對於oracle是否也是如此,所以請隨時給我啓發 – Asken

+0

我認爲SQL世界中的'loop'是某種邪惡的東西,特別是當有一種方法可以使用一個hit中有很多記錄的結果集(如在這種情況下)。 –

+0

+1我同意性能和避免循環通常是一件好事。 – xQbert

相關問題