在Oracle中使用Execute Immediate将数据插入表中

时间:2016-08-22 08:12:58

标签: sql oracle plsql dynamic-sql

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

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

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

2 个答案:

答案 0 :(得分:4)

您可以将第一个查询的结果转换为(日期)变量,然后使用:

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 ...模式一起使用。您可以使用单个列和子查询,但即使这样也不是一个好主意,如果子查询中有多个列,则不起作用。

答案 1 :(得分:0)

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