2011-09-07 72 views
0

我不想使用「循環」相關的關鍵字,我怎樣才能實現循環與基本的SQL命令在甲骨文?
我有兩個表:如何在sql中循環?

​​

我想環路B中的所有記錄,如果ID = AID,然後設置A.Color = B.Type
提前感謝!

+0

將'sql'標記編輯爲'plsql',因爲這是針對Oracle的。 –

回答

9

根據定義,循環是一個程序性構造。

SQL是聲明性的:告訴數據庫你想做什麼,而不是如何去做。

如果您完全相信您需要編寫這樣的程序,然後將其寫入Oracle過程語言PL/SQL中。

Bu我相信有可能在SQL中使用帶WHERE子句的UPDATE來做你想做的事情。

像這樣(每NullUserException校正):

UPDATE A SET A.Color = (SELECT B.Type FROM B WHERE A.ID = B.AID) 
+0

+1同意...... – CharithJ

+0

SQL查詢具有非法語法 – NullUserException

+0

@Null:有問題嗎?對我來說看起來很好。 – Joe

0

要做到這一點,你將不得不寫使用PL/SQL存儲過程。 Here是有關該主題的一些信息和論文的oracle頁面。

4

的另一種方法:

MERGE INTO a 
USING b 
ON (b.aid = a.id) 
WHEN MATCHED THEN UPDATE SET a.color = b.type; 
+0

+1好的答案。 – NullUserException

0

正如其他人指出的那樣,你也許可以用一個正常的DML語句解決您的問題,不涉及任何循環。但是,爲了給你如何完成你的要求在PL/SQL,這裏是一個例子一些基本...

DECLARE 
    CURSOR c IS 
     SELECT id, aid, type FROM b; 
    statement VARCHAR2(200); 
BEGIN 
    FOR iterator IN c LOOP 
     IF iterator.id = iterator.aid THEN 
      statement := 'UPDATE a SET color = ' || iterator.type || 'WHERE id = ' || iterator.id; 
      EXECUTE IMMEDIATE statement; 
     END IF; 
    END LOOP; 
END; 

這個匿名PL/SQL塊將通過表B中的每個記錄重複,而如果乙.id = b.aid,它將更新表a並設置a.color = b.type,其中a.id = b.id.

這似乎是你所要求的。這並不是一個有效的方法,因爲你在表b中每行都有一個DML語句,它有b.id = b.aid。但我想要更多地將其作爲語法示例。這只是通過一種方式遍歷遊標的一種方式;您還可以顯式地打開遊標並獲取記錄,但如果您不需要執行任何操作,而是遍歷整個結果集,則這樣更容易。