Ne construisez pas votre requête en ajoutant des chaînes. Vous vous exposez à de nombreux bogues et vulnérabilités, en premier lieu à l'injection SQL. La nécessité d'utiliser des requêtes dynamiques ne justifie pas de ne pas utiliser de variables de liaison. Si vous avez vraiment besoin d'utiliser des requêtes dynamiques (il n'est pas clair d'après votre exemple pourquoi la mise à jour statique ne fonctionnerait pas ? !), faites plutôt ceci :
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 se liera correctement avec le type approprié.