Toàn bộ khối PL / SQL được phân tích cú pháp tại thời điểm biên dịch, nhưng văn bản trong một câu lệnh động không được đánh giá cho đến thời gian chạy. (Chúng gần giống nhau đối với một khối ẩn danh, nhưng vẫn có các bước riêng biệt).
If / else của bạn cũng không được đánh giá cho đến thời gian chạy. Trình biên dịch không biết rằng bảng sẽ luôn tồn tại vào thời điểm bạn thực hiện chèn, nó chỉ có thể kiểm tra xem nó có tồn tại hay không tại thời điểm nó phân tích cú pháp toàn bộ khối.
Nếu bảng đã tồn tại thì không sao; trình biên dịch có thể nhìn thấy nó, khối thực thi, lựa chọn của bạn nhận được 1 và bạn chuyển sang khối khác để thực hiện việc chèn. Nhưng nếu nó không tồn tại thì việc phân tích cú pháp của chèn không thành công với ORA-00942 tại thời điểm biên dịch và không có gì trong khối được thực thi.
Vì việc tạo bảng là động, nên tất cả các tham chiếu đến bảng cũng phải động - phần chèn của bạn như bạn đã thấy, nhưng cũng có thể nếu sau đó bạn truy vấn nó. Về cơ bản, nó làm cho mã của bạn khó đọc hơn nhiều và có thể ẩn các lỗi cú pháp - vì mã động không được phân tích cú pháp cho đến thời gian chạy và có thể bạn có thể mắc lỗi trong một câu lệnh động trong một nhánh không được đánh lâu rồi.
Các bảng tạm thời toàn cục không nên được tạo ngay lập tức. Chúng là các đối tượng vĩnh viễn với dữ liệu tạm thời, cụ thể cho từng phiên và không nên được tạo / xóa như một phần của mã ứng dụng của bạn. (Ứng dụng của bạn nói chung không nên thực hiện thay đổi giản đồ nào; chúng nên được giới hạn trong các thay đổi nâng cấp / bảo trì và được kiểm soát, để tránh lỗi, mất dữ liệu và các tác dụng phụ không mong muốn; GTT cũng không khác gì).
Không giống như các bảng tạm thời trong một số cơ sở dữ liệu quan hệ khác, khi bạn tạo một bảng tạm thời trong cơ sở dữ liệu Oracle, bạn sẽ tạo một định nghĩa bảng tĩnh. Bảng tạm thời là một đối tượng liên tục được mô tả trong từ điển dữ liệu, nhưng xuất hiện trống cho đến khi phiên của bạn chèn dữ liệu vào bảng. Bạn tạo một bảng tạm thời cho chính cơ sở dữ liệu, không phải cho mọi thủ tục được lưu trữ PL / SQL.
Tạo GTT một lần và đặt tất cả mã PL / SQL của bạn ở trạng thái tĩnh. Nếu bạn muốn thứ gì đó gần gũi hơn với các bảng tạm thời cục bộ của SQL Server thì hãy xem xét các bộ sưu tập PL / SQL.