例如,我有一些表“Test”,其中有一列“my_date”。我想要做的是使用一些变量将记录添加到表中:
query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE ('insert into test values query_date');
我需要通过构造字符串和执行查询以这种方式将记录插入表中,但是我得到了错误。有可能这样做吗?
答案 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?只做传统的循环或变量。