【问题标题】:EXECUTE IMMEDIATE using column names from dual使用双重列名立即执行
【发布时间】:2017-04-28 15:55:16
【问题描述】:

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

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 子句的情况下解决这个问题吗?

【问题讨论】:

    标签: oracle dynamic-sql dual-table


    【解决方案1】:

    首先,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;
    

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

    PROCEDURE sp_directUpdate(COL C%ROWTYPE) IS
    BEGIN
    
       INSERT INTO T1 VALUES (COL.F0, COL.F1);
    
    END;
    

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

    【讨论】:

    • 我实际上是在尝试编写一个通用存储过程,用于将记录插入 500 个不同的表中。所以,我的绑定变量也需要是动态的。例如,我有一张桌子 T5。对于 T5,我需要 50 个不同的列值 - INSERT INTO T5 VALUES(COL.F0,COL.F1...COL.F50)。对于 T2,我只需要 2 个值。插入 T4 值(COL.F0,COL.F1)。在 SQL 中可以吗?
    • 这并不容易,如果它所做的只是作为已经支持任意绑定的内置 INSERT 语句的包装器,我会质疑为什么你想要一个过程。你冒着达到“内部平台效应”的风险。
    • 没错。我实际上是在寻找能够插入到我喜欢的任何表中的插入语句。
    • Yes.... 那是 SQL INSERT 语句。这正是它的用途。
    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2019-05-04
    相关资源
    最近更新 更多