我正在尝试立即执行整个FOR循环,但它不起作用。这是有可能的吗?
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循环。
发布于 2020-02-05 14:38:01
for循环是PL/SQL。动态SQL不是。如果您想动态运行PL/SQL代码,那么需要在dynamic语句中的PL/SQL块中运行它:
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; (以及缺少的分号)周围添加了所拥有的内容。
正如@APC所暗示的,您可以将语句拆分成多行,以提高可读性,例如:
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来执行此操作。
https://stackoverflow.com/questions/60078100
复制相似问题