ORACLE EXECUTE IMMEDIATE FOR LOOP ORA-06512



我正在尝试立即执行整个 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;
/

第二行工作得很好,但第三行(立即执行"V_ROW..."(不起作用。 立即执行中的字符串与第二行完全相同。

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

for 循环是 PL/SQL。动态 SQL 不是。如果你想动态运行PL/SQL代码,那么你需要把它放在动态语句中的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;

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

正如@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执行此操作。

最新更新