您可以将第一个查询的结果放入(日期)变量中,然后使用它:
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 ... 模式一起使用。您可以使用单个列和一个子查询,但即使这样也不是一个好主意,并且如果您在子查询中有多个列,则不起作用。