首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORACLE立即执行循环ORA-06512

ORACLE立即执行循环ORA-06512
EN

Stack Overflow用户
提问于 2020-02-05 14:32:30
回答 1查看 1.9K关注 0票数 0

我正在尝试立即执行整个FOR循环,但它不起作用。这是有可能的吗?

代码语言:javascript
复制
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;
/

第二行运行得很好,但是第三行(执行立即'FOR V_ROW .‘)不管用。“立即执行”中的字符串与第2行完全相同。

我需要为参数选择执行一个FOR循环。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-05 14:38:01

for循环是PL/SQL。动态SQL不是。如果您想动态运行PL/SQL代码,那么需要在dynamic语句中的PL/SQL块中运行它:

代码语言:javascript
复制
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;

也就是说,在BEGINEND; (以及缺少的分号)周围添加了所拥有的内容。

正如@APC所暗示的,您可以将语句拆分成多行,以提高可读性,例如:

代码语言:javascript
复制
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;

现在还不清楚为什么要用这个例子来实现这个目的。如果要使用“参数选择”,则可能计划将其插入动态语句;但即使这样也可能没有必要,具体取决于您的意思和如何获得查询。甚至还不清楚为什么您会在循环中或使用PL/SQL来执行此操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60078100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档