Lav ikke din forespørgsel ved at tilføje strenge. Du efterlader dig selv åben over for masser af fejl og sårbarheder, først og fremmest SQL-injektion. Behovet for at bruge dynamiske forespørgsler retfærdiggør ikke, at man undlader at bruge bindevariabler. Hvis du virkelig har brug for at bruge dynamiske forespørgsler (det fremgår ikke klart af dit eksempel, hvorfor statisk opdatering ikke ville fungere?!), skal du gøre dette i stedet:
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 binder korrekt med den passende type.