Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Chèn dữ liệu vào bảng bằng cách sử dụng thực thi ngay trong Oracle

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, col2query_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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SqlPlus - lưu đầu ra trong một tệp nhưng không hiển thị trên màn hình

  2. Bao gồm giá trị RowId trong Bảng lồng nhau

  3. Oracle Managed ODP.NET không thể tìm thấy tnsnames.ora

  4. Oracle, cách mở con trỏ và chọn một cột trong số nhiều cột vào một biến

  5. Thêm điều kiện trong câu lệnh MERGE trong Oracle SQL cho INSERT / UPDATE