Erstellen Sie Ihre Abfrage nicht durch Anhängen von Zeichenfolgen. Sie lassen sich vielen Fehlern und Schwachstellen aussetzen, allen voran der SQL-Injektion. Die Notwendigkeit, dynamische Abfragen zu verwenden, rechtfertigt nicht die Verwendung von Bind-Variablen. Wenn Sie wirklich dynamische Abfragen verwenden müssen (aus Ihrem Beispiel geht nicht hervor, warum die statische Aktualisierung nicht funktionieren würde?!), tun Sie stattdessen Folgendes:
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 bindet korrekt mit dem entsprechenden Typ.