2016-02-10 2 views
0

Это SQL блок я использую в Oracle,ДЛЯ ОБНОВЛЕНИЯ КУРСОРА в терадате?

Теперь мне нужно сделать то же самое в Teradata, возможно? Я хочу синтаксис FOR UPDATE CURSOR в Teradata!

Вы можете мне помочь?

declare 
cursor c1 is select * from Employees FOR UPDATE; 
a number :=0 ; 
begin 
for x in c1 loop 
    a := a +1 ; 
    update employees set salary = a where current of c1; 
end loop; 
end; 
+1

Зачем вам такой указатель? Это эквивалентно началу транзакции и ее открытию, пока пользователь идет на кофе. Такова смерть для масштабируемости. Гораздо лучший вариант (в Oracle) - использовать оптимистичный параллелизм. Что касается цикла, это просто отрицает любое преимущество в производительности, предоставляемое с помощью базы данных. –

ответ

1

Обновляемые курсоры допускаются только в сеансах в режиме ANSI.

Синтаксис очень похож:

declare c1 cursor for 
    select * from Employees FOR UPDATE; 
a number :=0 ; 
begin 
for x in c1 loop 
    a := a +1 ; 
    update employees set salary = a where current of c1; 
end loop; 
end; 

Но курсоры выполняют очень плохо в параллельных СУБД, как Teradata, как они обрабатываются последовательно, один ряд за другим.

Практически в каждом случае курсоры данных могут быть переписаны на основе набора (например, ваш пример - простой ROW_NUMBER), а затем они выполняют на несколько порядков быстрее.

+0

Курсоры и циклы выполняются ужасно в любой базе данных, а не только в параллельной. Код Oracle может работать в несколько тысяч раз быстрее, если используется UPDATE с ROW_NUMBER –

+0

@PanagiotisKanavos: Конечно, курсоры всегда плохие, это еще хуже, когда вы получили массивную параллельную систему с несколькими серверами, и процесс выполняет «FETCH» NEXT' :-) – dnoeth

0

Возможно, вы могли бы использовать это вместо этого?

UPDATE employees 
FROM (
    SELECT csum(1,1) new_salary, emp_id 
    FROM employees 
) src 
set salary=src.new_salary 
where employees.emp_id=src.emp_id; 
+0

, но в приведенном выше коде emp_id должен быть уникальным индексом или первичным ключом. Если в этом смысле нет уникального столбца, как я могу это достичь? –