ORACLE ВЫПОЛНИТЬ НЕМЕДЛЕННО ДЛЯ L OOP ORA-06512 - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь ИСПОЛНИТЬ НЕМЕДЛЕННО для FOR L OOP, но это не работает. Это можно сделать?

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;
     EXECUTE IMMEDIATE '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;
/

Вторая строка работает очень хорошо, но 3-я строка (EXECUTE IMMEDIATE 'FOR V_ROW ...') не работает. Строка внутри EXECUTE IMMEDIATE точно такая же, как и во 2-й строке.

Мне нужно выполнить FOR L OOP для параметра c SELECT.

1 Ответ

2 голосов
/ 05 февраля 2020

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.

...