A для l oop - PL / SQL. Dynami c SQL нет. Если вы хотите запускать код PL / SQL динамически, тогда вам нужно иметь его в PL / SQL блоке в пределах оператора dynamici c:
BEGIN
EXECUTE IMMEDIATE 'BEGIN FOR V_ROW IN (SELECT ROWNUM AS RN,ID AS ID FROM (SELECT ID FROM T_OPDM_PLANDEACCION WHERE IDOPORTUNIDAD=2 ORDER BY ORDEN)) LOOP UPDATE T_OPDM_PLANDEACCION SET ORDEN=V_ROW.RN WHERE ID=V_ROW.ID;END LOOP;END;';
END;
То с добавлением BEGIN
и END;
(и пропущенной точки с запятой) к тому, что у вас было.
Как намекнул @ AP C, вы можете разбить свое утверждение на несколько строк для улучшения читабельности, например:
BEGIN
EXECUTE IMMEDIATE '
BEGIN
FOR V_ROW IN (
SELECT ROWNUM AS RN,ID AS ID
FROM (
SELECT ID
FROM T_OPDM_PLANDEACCION
WHERE IDOPORTUNIDAD=2
ORDER BY ORDEN
)
)
LOOP
UPDATE T_OPDM_PLANDEACCION
SET ORDEN=V_ROW.RN
WHERE ID=V_ROW.ID;
END LOOP;
END;
';
END;
Не очевидно, почему вы захотите сделать это с этим примером. Если вы собираетесь использовать «параметр c выбор», то вы, возможно, планируете внедрить это в динамический оператор c; но даже это может не понадобиться, в зависимости от того, что именно вы имеете в виду и как вы получите запрос. Даже не ясно, зачем вам это делать в oop или в PL / SQL.