2016-04-25 21 views
2

なぜ「rowid」を使用できるときにOracleは「現在の」where構文を作成しましたか?例:PL/SQL「WHERE CURRENT OF」と「ROWID」

BEGIN 
    FOR rec IN (SELECT t.column1, t.rowid rid FROM test_table) LOOP 
    UPDATE test_table tb SET column1 = some_function(rec.column1) WHERE tb.rowid = rec.rid; 
    END LOOP; 
    COMMIT; 
END; 

DECLARE 
    CURSOR cur IS SELECT t.column1 FROM test_table; 
    param1 test_table.column1%TYPE; 
BEGIN 
    LOOP 
    FETCH cur INTO param1; 
    UPDATE test_table tb SET tb.column1 = some_function(param1) WHERE CURRENT OF cur; 
    EXIT WHEN cur%NOTFOUND; 
    END LOOP; 
    COMMIT; 
END; 
+0

Oracleは、セッション内のFOR UPDATE OFカーソルによってロックされた行を更新または削除するために、WHERE CURRENT OF句を提供します。 –

答えて

0

カーソルの最後のFETCHED ROWを識別するために使用されます。あなたが100%信頼しているので、より安全です。 curosrからLAST FETCHED ROWを更新しています。 ROWIDでは危険があります。何かを台無しにするのは本当に簡単です。

+0

あなたは費用について何が言えますか? – PolyMorph

+0

最後にFETCHされた行 - したがって、1になるようにサポートされたコスト(悪いインテルを与えたくない:)) ROWID - 私はlibararyの例について説明します。あなたがROWID(住所)のない本を見つけたいなら、あなたは1番目から始まるすべての本を通って、あなたが望むものを見つけるまであなたは行き​​ます。 WITH ROWIDあなたは情報を持っています。どこに行くのですか。どこの路地、どの棚と位置にするかは、すべての検索をスキップしてアドレスに移動するだけです。その場合は、コストも1になるようにサポートされています。しかし、それはあなたのコードに大きく依存します。 –