2016-04-25 8 views
2

Почему Oracle сделал синтаксис «где текущий», когда вы можете использовать «rowid»? Пример:PL/SQL «WHERE CURRENT OF» vs «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 предоставляет предложение WHERE CURRENT OF для обновления или удаления строк, заблокированных курсором FOR UPDATE OF в сеансе. –

ответ

0

Where Current Of используется для идентификации последней загруженной строки в курсоре. Это более безопасно, потому что у вас есть 100% уверенность, что f.e. Вы обновляете LAST FETCHED ROW из curosr. С Ровидами существует опасность, потому что это действительно легко что-то испортить.

+0

А что вы можете сказать о стоимости? – PolyMorph

+0

LAST FETCHED ROW - так что ПОТОМУ ЧТОБЫ быть 1 (не хочу давать плохой интеллект :)) ROWID - Я объясняю на примере libarary. Если вы хотите найти книгу без ROWID (адрес), вы просматриваете все книги, начиная с 1-го, пока не найдете то, что хотите. С rowid У вас есть информация, куда идти, какая переулок, какая полка и позиция, чтобы вы просто пропустили весь поиск и пошли по адресу. В этом случае он также SUPPOSED будет стоить 1. Но это сильно зависит от вашего кода. –