Я не играл с этим XML-материалом, но
EXECUTE IMMEDIATE 'UPDATE ' || table ||
' SET ' || direction || ' = 4 WHERE CURRENT OF ' || cur;
cur - это идентификатор курсора, а не содержимое локальной переменной, поэтому он более вероятно будет работать с
EXECUTE IMMEDIATE 'UPDATE ' || table ||
' SET ' || direction || ' = 4 WHERE CURRENT OF cur';
Это предполагает, что контекст cur сохраняется, что, я подозреваю, не будет. Для начала «CURRENT» включает в себя одну строку, но вы выбираете до 2000. Я думаю, вам нужно будет выбрать идентификаторы (до) 2000 выбранных строк и обновить индивидуально.
Более широкое описание ситуации может помочь