Bygg inte din fråga genom att lägga till strängar. Du lämnar dig själv öppen för massor av buggar och sårbarheter, först och främst SQL-injektion. Behovet av att använda dynamiska frågor motiverar inte att man inte använder bindningsvariabler. Om du verkligen behöver använda dynamiska frågor (det framgår inte av ditt exempel varför statisk uppdatering inte skulle fungera?!), gör så här istället:
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 kommer att binda korrekt med lämplig typ.