在 Oracle 中使用 Execute Immediate 将数据插入表中
Posted
技术标签:
【中文标题】在 Oracle 中使用 Execute Immediate 将数据插入表中【英文标题】:Inserting Data Into Table Using Execute Immediate in Oracle 【发布时间】:2016-08-22 08:12:57 【问题描述】:例如,我有一些表 "Test" ,其中有一列 "my_date" 。我想要做的是使用一些变量将记录添加到表中:
query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE ('insert into test values query_date');
我需要通过构造字符串和执行查询以这种确切的方式将记录插入到表中,但是我得到了错误。有可能这样做吗?
【问题讨论】:
您的query_date
变量应该保存第一个查询的日期还是查询本身?不管怎样,为什么要使用动态 SQL?
【参考方案1】:
您可以将第一个查询的结果放入(日期)变量中,然后使用它:
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
选择列表中的列表达式数量也不同,您也必须动态构建列列表,否则插入的列太多或太少。
具体操作方式取决于您构建查询字符串的方式 - 本质上,当您将表达式添加到查询字符串时,您还会将列名添加到单独的列表中,并最终得到:
EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);
其中column_list
被构建为col1, col2
和query_string
为select x.col1, y.col2 from ...
。
在您展示的内容中没有明显的理由使用动态 SQL。或者,如果您真的在使用 sysdate,则需要单独的查询来获得它,您可以这样做:
insert into test (my_date) values (sysdate)
...所以我假设您的真实情况确实更复杂。但请注意,您不要将 values
关键字与 insert ... select ...
模式一起使用。您可以使用单个列和一个子查询,但即使这样也不是一个好主意,并且如果您在子查询中有多个列,则不起作用。
【讨论】:
如果您有多个列并且真的想动态地执行它,那么上面的第二个代码块将起作用。但是,如果列数不同,而不仅仅是值的来源,您也需要构建列列表。【参考方案2】:为什么插入语句需要 EXECUTE IMMEDIATE ? 只要您插入值的基表保持不变,我们就不需要执行 EXIMM。现在查询日期?只需执行传统的循环或变量操作即可。
【讨论】:
以上是关于在 Oracle 中使用 Execute Immediate 将数据插入表中的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE中EXECUTE IMMEDIATE语句中使用的where子句中需要使用动态变量