在 Oracle 中使用立即执行将数据插入 Table

Inserting Data Into Table Using Execute Immediate in Oracle

例如,我有一些 table "Test" 其中有一列 "my_date" 。我想做的是使用一些变量将记录添加到 table:

query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE ('insert into test values query_date');

我需要通过构造字符串和执行查询以这种方式将记录插入 table,但是我得到了错误。有可能这样做吗?

您可以将第一个查询的结果放入一个(日期)变量中,然后使用它:

SELECT sysdate into query_date FROM dual;
insert into test (my_date) values (query_date)
-- or if you really want dynamic SQL, with a bind variable
EXECUTE IMMEDIATE 'insert into test (my_date) values (:query_date)' using query_date;

或者从字面上阅读您的问题,将第一个字符串连接起来作为第二个字符串的一部分:

query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;

如果您打印出第二条语句而不是执行它,您会看到:

insert into test (my_date) SELECT sysdate FROM dual

... 有效 SQL。如果 query_string 更复杂或者它本身是动态构造的,这将起作用。但是,如果 query_string select 列表中的列表达式数量也不同,则您也必须动态构建列列表,否则插入的列太多或太少。

具体如何操作取决于您构建查询字符串的方式 - 本质上,当您向查询字符串添加表达式时,您还将向单独的列表添加列名,并最终得到:

EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);

其中 column_list 构建为 col1, col2query_string 构建为 select x.col1, y.col2 from ...


没有明显的理由在您展示的内容中使用动态 SQL。或者,如果您真的在使用 sysdate,则需要单独查询才能获得它,您可以这样做:

insert into test (my_date) values (sysdate)

...所以我假设您的真实情况确实更复杂。但请注意,不要将 values 关键字与 insert ... select ... 模式一起使用。您可以使用单个列和一个子查询,但即便如此这也不是一个好主意,如果子查询中有多个列则不起作用。

为什么需要 EXECUTE IMMEDIATE for Insert 语句? 只要您插入值的基数 table 保持不变,我们就不需要执行 EXIMM。现在 query_date ?只是做一个传统的循环或变量的事情。