Làm cách nào để bạn tạo một bảng tạm thời trong cơ sở dữ liệu Oracle?


91

Tôi muốn tạo một bảng tạm thời trong cơ sở dữ liệu Oracle

cái gì đó như

Declare table @table (int id)

Trong máy chủ SQL

Và sau đó điền nó bằng một câu lệnh chọn

Có khả thi không?

Cảm ơn

Câu trả lời:


130

Đúng, Oracle có các bảng tạm thời. Đây là một liên kết đến một bài báo của AskTom mô tả chúng và đây là tài liệu chính thức của oracle CREATE TABLE.

Tuy nhiên, trong Oracle, chỉ dữ liệu trong bảng tạm thời là tạm thời. Bảng là một đối tượng thông thường hiển thị cho các phiên khác. Thường xuyên tạo và thả các bảng tạm thời trong Oracle là một thói quen xấu.

CREATE GLOBAL TEMPORARY TABLE today_sales(order_id NUMBER)
ON COMMIT PRESERVE ROWS;

Oracle 18c đã thêm các bảng tạm thời riêng tư, là các đối tượng trong bộ nhớ một phiên. Xem tài liệu để biết thêm chi tiết. Các bảng tạm thời riêng tư có thể được tạo và loại bỏ động.

CREATE PRIVATE TEMPORARY TABLE ora$ptt_today_sales AS
SELECT * FROM orders WHERE order_date = SYSDATE;

Bảng tạm thời có thể hữu ích nhưng chúng thường bị lạm dụng trong Oracle. Chúng thường có thể tránh được bằng cách kết hợp nhiều bước vào một câu lệnh SQL duy nhất sử dụng các dạng xem nội tuyến.


40
Không phản đối, nhưng tôi sẽ không bao giờ đề xuất TẠO BẢNG NHƯ CHỌN cho bảng tạm thời toàn cầu - một nhà phát triển ít kinh nghiệm hơn có thể hiểu sai rằng họ phải điền GTT theo cách này mọi lúc. Chắc chắn, đây là một cách thuận tiện để sao chép định nghĩa từ một bảng khác, nhưng ví dụ này có thể sẽ khiến một số người nhầm lẫn.
Jeffrey Kemp

Tôi hoàn toàn đồng ý với Jeffrey Kemp ở đây, đây chỉ là một cách để tạo bảng này, tôi đã chạy vào điều này và nhận ra rằng, tôi có phải đặt câu lệnh select này trong DDL của mình không.
Vijay Kumar

3
bạn chỉ có thể thêm "nơi 1 = 0";
Palcente

@Palcente vẫn ngụ ý rằng bạn cần một "bảng thực" có cùng cấu trúc để tạo một bảng tạm thời, điều này không đúng như vậy (cũng xem câu trả lời này . Ngoài ra, câu trả lời này không chỉ ra rằng không chỉ các GLOBAL bảng tạm thời, nhưng người ta cũng có thể sử dụng bảng tạm thời "bình thường". sự khác biệt đến SQL server, như đã chỉ ra bởi Matthew , là một một thời điểm quan trọng nên chắc chắn không bỏ lỡ (hay ngạc nhiên về lỗi trên "cuộc gọi thứ hai" về đối tượng đã tồn tại;)
Izzy

2
Trường hợp sử dụng hợp lệ cho CREATE TABLE AS SELECT: chọn từ các bảng từ xa có cột LOB, vì bạn không thể trực tiếp SELECTtừ chúng. Tôi đang viết một thủ tục để sao chép các bản ghi từ cơ sở dữ liệu từ xa và đây là giải pháp của tôi: đưa các bản ghi vào GTT, rồi sao chép từ đó vào bảng "thực".
rgoliveira

78

Chỉ là một mẹo .. Các bảng tạm thời trong Oracle khác với SQL Server. Bạn tạo nó MỘT LẦN và chỉ MỘT LẦN, không phải mọi phiên. Các hàng bạn chèn vào đó chỉ hiển thị với phiên của bạn và tự động bị xóa (tức là TRUNCATEkhông DROP) khi bạn kết thúc phiên của mình (hoặc kết thúc giao dịch, tùy thuộc vào điều khoản "ON COMMIT" mà bạn sử dụng).


15
Tôi không hiểu hết. Bạn nói rằng bạn tạo nó một lần và chỉ một lần, và không phải mọi phiên. Tuy nhiên, bạn cũng nói rằng bảng tạm thời bị xóa mỗi phiên. Điều đó không có nghĩa là bạn sẽ cần tạo bảng tạm thời mỗi phiên?
Chaos

31
DELETED, không phải DROPped.
Tripp Kinetics vào

10
Bạn không tạo bảng tạm thời mỗi phiên, nhưng một lần. Bảng có sẵn trên toàn hệ thống. Bảng có thể truy cập từ bất kỳ phiên nào bạn tạo, bao gồm cả các phiên song song. nhưng khi bạn chèn dữ liệu từ bên trong một phiên, dữ liệu đó sẽ không hiển thị từ các phiên song song khác trên toàn hệ thống. Dữ liệu của một phiên chỉ là thuộc tính của phiên đó. Do đó, dữ liệu là phiên cụ thể, không hiển thị theo hệ thống. Do đó, khi bạn đóng một phiên, dữ liệu của phiên đó sẽ bị xóa khỏi bảng.
Nhấn mạnh vào

33
CREATE GLOBAL TEMPORARY TABLE Table_name
    (startdate DATE,
     enddate DATE,
     class CHAR(20))
  ON COMMIT DELETE ROWS;

10
Lưu ý rằng các hàng sẽ luôn bị xóa vào cuối phiên; ON COMMIT DELETE ROWScó nghĩa là chúng sẽ bị loại bỏ sớm hơn, nếu bạn cam kết tăng dần trong một phiên.

1
zygimantus, vâng, bạn có thể xóa thủ công trong phiên. Trong suốt phiên, bảng tạm thời hoạt động chính xác như một bảng bình thường. Sự khác biệt duy nhất giữa bảng tạm thời và bảng thực, từ quan điểm của người dùng, là tất cả các hàng sẽ bị xóa khi phiên kết thúc và không phiên nào khác có thể đọc nội dung của bảng được phiên sử dụng. Có một phiên bản của bảng mỗi phiên; hai phiên có thể sử dụng cùng một bảng tạm thời cùng một lúc và có hai nhóm hàng khác nhau, không có bất kỳ xung đột nào.
Hans Deragon

-2

TẠO BẢNG table_temp_list_objects NHƯ

CHỌN o.owner, o.object_name FROM sys.all_objects o WHERE o.object_type = 'TABLE';


Vui lòng định dạng câu trả lời của bạn. Sẽ rất tốt nếu bạn viết gì đó về mã của mình.
Hostel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.