0

在我的包中,我有一个这样的程序:

PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN

   EXECUTE IMMEDIATE 'INSERT INTO T1(SELECT COL.F0, COL.F1 FROM DUAL)';

END IF;

END;

对于表 T1,我只需要双列中的两列:COL.F0 和 COL.F1。

当我执行这个语句时,我得到“COL”。“F1”是一个无效的标识符。

在同一过程中,为了将值插入表 T2,我的语句可能如下所示:

 EXECUTE IMMEDIATE 'INSERT INTO T2(SELECT COL.F0, COL.F1, COL.F4 FROM 
  DUAL)';

我会再次遇到类似的问题。你能建议我在不使用 INTO 子句的情况下解决这个问题吗?

4

1 回答 1

0

首先,语法在查询周围INSERT AS SELECT没有括号。()

如果使用 EXECUTE IMMEDIATE,则语句是在过程上下文之外执行的字符串,因此它不能引用参数。您需要将它们作为绑定变量提供,例如:

PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN

   EXECUTE IMMEDIATE 'INSERT INTO T1 AS SELECT :1, :2 FROM DUAL'
     USING COL.F0, COL.F1;

END;

但是,我会质疑您是否需要使用动态 SQL - 您可以直接运行插入:

PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN

   INSERT INTO T1 AS SELECT COL.F0, COL.F1 FROM DUAL;

END;

此外,在这种情况下,您可以使用单行插入语句而不是运行“插入为选择”:

PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
BEGIN

   INSERT INTO T1 VALUES (COL.F0, COL.F1);

END;

PS如果这应该进行插入,为什么该过程称为“directUpdate”?:)

于 2017-04-28T07:55:16.837 回答