2014-10-29 157 views
0

任何幫助,請這? 我想回到所有那些誰住在法國,然後與那些誰住在BELguim對它們進行比較,如果它們具有相同的名稱或name_done顯示結果INTO子句預計在這SELECT語句

declare 
    cursor c is select namer from poeple where city = 'France'; 
    c_res c%rowtype; 
begin 
    open c; 
    loop 
    fetch c into c_res; 
    exit when c%notfound; 
    select * from poeple tw where city = 'BELguim' AND (c_res.namer = tw.namer OR c_res.namer = tw.namer || ' _done'); 
    end loop; 
    close c; 
end; 
+0

你確定光標'c'真的必須有''法國''條件嗎?它不應該是'法國'嗎?我覺得有一個'''和一個空間比應該有的多。 – nop77svk 2014-10-29 10:38:18

+0

@ nop77svk是編輯完成 – 2014-10-29 10:41:02

回答

1

爲什麼使用遊標?你可以用一個單一的查詢寫:

select pb.* 
from poeple pf join 
    poeple pb 
    on pf.city = 'France' and pb.city = 'BELgium' and 
     (pf.namer = pb.namer or pf.namer = pb.namer || ' _done'); 

的問題與您的代碼是PL/SQL不允許查詢從代碼塊返回任何東西。您可以打印出結果,將值插入變量,或將它們放入另一個表格中。但是,您不能只從查詢中獲得結果。

+0

實際上,因爲我需要更新每一行百位,所以我需要遊標,我不能用戶加入更新 – 2014-10-29 10:42:19

+1

然後,您應該使用'update'語句,而不是'select'。你可以用'update'來做你想做的事情,而不用光標。你當然可以用'merge'來做你所需要的。 – 2014-10-29 10:50:36

1

的問題是:

SELECT * FROM永世TW其中城市= 'BELguim' AND(c_res.namer = tw.namer OR c_res.namer = tw.namer || '_done') ;

您無法直接在PL/SQL中輸入SQL。 PL/SQL引擎需要一個INTO子句。

看着你的代碼,你不需要cursor c。它可以用一個SQL編寫。這使回戈登的查詢:

select pb.* 
from poeple pf join 
    poeple pb 
    on pf.city = 'France' and pb.city = 'BELgium' and 
     (pf.namer = pb.namer or pf.namer = pb.namer || ' _done'); 

如果你真的需要PL/SQL的一些東西,你沒有解釋,例如返回結果集作爲REF CURSOR,然後有一個OUT參數作爲REF CURSOR。但是,你需要解釋這個要求。

如果你可以在SQL中做某些事情,那麼不要使用PL/SQL。

編輯如果你的最終目標是要更新,然後使用上面的查詢作爲MERGE聲明USING條款。

+0

是的,我需要返回結果集,所以更進一步,我可以更新每一行 – 2014-10-29 11:00:22

+0

'MERGE'是你所需要的。 – 2014-10-29 11:01:55