2011-12-02 71 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

相关问题