Nie buduj zapytania, dołączając ciągi. Narażasz się na wiele błędów i luk, przede wszystkim wstrzyknięcie SQL. Konieczność używania zapytań dynamicznych nie uzasadnia nieużywania zmiennych wiązania. Jeśli naprawdę potrzebujesz użyć zapytań dynamicznych (z twojego przykładu nie jest jasne, dlaczego aktualizacja statyczna nie zadziała?!), zrób to:
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 połączy się poprawnie z odpowiednim typem.