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

Các lựa chọn thay thế cho các bảng tạm thời trong Oracle

Vấn đề kinh doanh mà bạn đang cố gắng giải quyết là gì? Đặc biệt hiếm khi bạn cần sử dụng các bảng tạm thời trong Oracle. Tại sao bạn không đơn giản

SELECT *
  FROM employees
 WHERE id = p_id_passed_in;

Trong các cơ sở dữ liệu khác, bạn thường tạo các bảng tạm thời vì trình đọc chặn người viết nên bạn muốn tạo một bản sao riêng của dữ liệu để tránh chặn bất kỳ phiên nào khác. Tuy nhiên, trong Oracle, trình đọc không bao giờ chặn người viết, vì vậy nói chung không cần lưu một bản sao dữ liệu riêng biệt.

Trong các cơ sở dữ liệu khác, bạn tạo các bảng tạm thời vì bạn không muốn đọc bẩn. Tuy nhiên, Oracle không cho phép đọc bẩn. Tính nhất quán đọc nhiều phiên bản có nghĩa là Oracle sẽ luôn hiển thị cho bạn dữ liệu như đã tồn tại khi truy vấn được bắt đầu (hoặc khi giao dịch bắt đầu nếu bạn đã đặt mức cách ly giao dịch là có thể tuần tự hóa). Vì vậy, không cần phải tạo một bảng tạm thời để tránh đọc bẩn.

Nếu bạn thực sự muốn sử dụng bảng tạm thời trong Oracle, bạn sẽ không tạo bảng động. Bạn sẽ tạo một bảng tạm thời chung trước khi tạo thủ tục được lưu trữ. Cấu trúc bảng sẽ hiển thị cho tất cả các phiên nhưng dữ liệu sẽ chỉ hiển thị cho phiên đã chèn nó. Bạn sẽ điền bảng tạm thời vào thủ tục và sau đó truy vấn bảng. Một cái gì đó giống như

CREATE GLOBAL TEMPORARY TABLE temp_emp (
  empno number,
  ename varchar2(10),
  job   varchar2(9),
  mgr   number,
  sal   number(7,2)
)
ON COMMIT PRESERVE ROWS;

CREATE OR REPLACE PROCEDURE populate_temp_emp
AS
BEGIN
  INSERT INTO temp_emp( empno,
                        ename,
                        job,
                        mgr,
                        sal )
    SELECT empno, 
           ename,
           job,
           mgr,
           sal
      FROM emp;
END;
/

SQL> begin
  2    populate_temp_emp;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select *
  2    from temp_emp;

     EMPNO ENAME      JOB              MGR        SAL
---------- ---------- --------- ---------- ----------
      7623 PAV        Dev
      7369 smith      CLERK           7902        800
      7499 ALLEN      SALESMAN        7698       1600
      7521 WARD       SALESMAN        7698       1250
      7566 JONES      MANAGER         7839       2975
      7654 MARTIN     SALESMAN        7698       1250
      7698 BLAKE      MANAGER         7839       2850
      7782 CLARK      MANAGER         7839       2450
      7788 SCOTT      ANALYST         7566       3000
      7839 KING       PRESIDENT                  5000
      7844 TURNER     SALESMAN        7698       1500
      7876 ADAMS      CLERK           7788       1110
      7900 SM0        CLERK           7698        950
      7902 FORD       ANALYST         7566       3000
      7934 MILLER     CLERK           7782       1300
      1234 BAR

16 rows selected.

Tuy nhiên, như tôi đã nói, sẽ rất bất thường trong Oracle nếu thực sự muốn sử dụng một bảng tạm thời.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. điều gì xảy ra trong giai đoạn chuyển tiếp của việc áp dụng trong R12.2

  2. Tạo CTE trong Oracle

  3. Có được phép sử dụng một SELECT bên trong một hàm bảng PL / SQL có kết cấu không?

  4. Bí danh bảng không hoạt động trong các truy vấn Oracle SQL thô bên trong Django

  5. Kết nối bên trong SQL trên các câu lệnh chọn