Bạn có thể lấy kết quả của truy vấn đầu tiên vào một biến (ngày) và sau đó sử dụng biến đó:
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;
Hoặc đọc câu hỏi của bạn theo nghĩa đen, sử dụng chuỗi đầu tiên như một phần của chuỗi thứ hai bằng cách nối nó:
query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;
Nếu bạn in ra câu lệnh thứ hai thay vì thực thi nó, bạn sẽ thấy:
insert into test (my_date) SELECT sysdate FROM dual
... là SQL hợp lệ. Điều này sẽ hoạt động nếu query_string
phức tạp hơn hoặc bản thân nó đang được xây dựng động. Nhưng nếu số biểu thức cột trong query_string
danh sách lựa chọn cũng khác nhau, bạn cũng sẽ phải tạo danh sách cột động, nếu không, bạn sẽ có quá nhiều hoặc quá ít cột cho phần chèn.
Chính xác cách bạn làm điều đó phụ thuộc vào cách bạn đang xây dựng chuỗi truy vấn - về cơ bản khi bạn thêm một biểu thức vào chuỗi truy vấn, bạn cũng sẽ thêm tên cột vào một danh sách riêng biệt và kết thúc bằng:
EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);
ở đâu column_list
được xây dựng như nói col1, col2
và query_string
as select x.col1, y.col2 from ...
.
Không có lý do rõ ràng để sử dụng SQL động trong những gì bạn đã trình bày. Hoặc, nếu bạn thực sự đang sử dụng sysdate, bất kỳ yêu cầu nào về truy vấn riêng để có được điều đó, bạn chỉ cần làm:
insert into test (my_date) values (sysdate)
... vì vậy tôi cho rằng kịch bản thực của bạn thực sự phức tạp hơn. Nhưng lưu ý rằng bạn không sử dụng các giá trị values
từ khóa với insert ... select ...
họa tiết. Bạn có thể thực hiện với một cột và một truy vấn con nhưng ngay cả khi đó không phải là ý kiến hay và không hiệu quả nếu bạn có nhiều cột trong truy vấn con.