在 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, col2
,query_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 ?只是做一个传统的循环或变量的事情。
例如,我有一些 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, col2
,query_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 ?只是做一个传统的循环或变量的事情。