Не създавайте вашата заявка чрез добавяне на низове. Оставяте се отворени за много грешки и уязвимости, на първо място SQL инжекция. Необходимостта от използване на динамични заявки не оправдава неизползването на свързващи променливи. Ако наистина трябва да използвате динамични заявки (от вашия пример не става ясно защо статичната актуализация няма да работи?!), направете това вместо това:
FOR vc2 IN (...) LOOP
v_sql :=
'BEGIN
V_UPD NUMBER := 0;
SELECT (SELECT ID_TIPO_TERR
FROM ZREPORTYTD_TMP
WHERE AUDITORIA = :p1
AND TERRITORIO = :p2
AND PRODUTO = :p3)
INTO V_UPD FROM DUAL;
UPDATE ZReportYTD_TMP
SET TARGET = :p4
WHERE AUDITORIA = :p5
AND TERRITORIO = :p6
AND PRODUTO = :p7;
END';
EXECUTE IMMEDIATE v_sql USING VC2.AUDITORIA, VC2.NOME, VC2.PRODUTO,
VC2.OBJETIVO, VC2.AUDITORIA, VC2.NOME,
VC2.PRODUTO;
END LOOP;
Oracle ще се свърже правилно с подходящия тип.