Các bảng tạm thời toàn cầu của Oracle không phải là các đối tượng nhất thời. Chúng là bảng đống thích hợp. Chúng tôi tạo chúng một lần và bất kỳ phiên nào có thể sử dụng chúng để lưu trữ dữ liệu chỉ hiển thị cho phiên đó .
Khía cạnh tạm thời là dữ liệu không liên tục ngoài một giao dịch hoặc một phiên. Chi tiết triển khai chính là dữ liệu được ghi vào một không gian bảng tạm thời không phải là một không gian bảng vĩnh viễn. Tuy nhiên, dữ liệu vẫn được ghi vào - và đọc từ - đĩa, do đó, việc sử dụng các bảng tạm thời toàn cầu sẽ có một chi phí đáng chú ý.
Vấn đề là chúng ta không được phép bỏ và tạo lại các bảng tạm thời. Nếu bạn đang cố gắng chuyển logic kiểu SQL Server sang Oracle thì bạn nên cân nhắc sử dụng bộ sưu tập PL / SQL để duy trì dữ liệu tạm thời trong bộ nhớ. Tìm hiểu thêm.
Nguyên nhân cụ thể của ORA-14452
là chúng ta không thể loại bỏ một bảng tạm thời toàn cục có tính ổn định trong phạm vi phiên nếu nó có chứa dữ liệu trong phiên. Ngay cả khi bảng hiện đang trống ...
SQL> create global temporary table gtt23 (col1 number)
2 on commit preserve rows
3 /
Table created.
SQL> insert into gtt23 values (1);
1 row created.
SQL> commit;
Commit complete.
SQL> delete from gtt23;
1 row deleted.
SQL> commit;
Commit complete.
SQL> drop table gtt23;
drop table gtt23
*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
SQL>
Giải pháp là kết thúc phiên và kết nối lại hoặc (hơi kỳ lạ) để cắt ngắn bảng rồi thả nó xuống.
SQL> truncate table gtt23;
Table truncated.
SQL> drop table gtt23;
Table dropped.
SQL>
Nếu một số phiên khác đang sử dụng bảng tạm thời chung - và điều đó là có thể (do đó, toàn cầu danh pháp) thì bạn sẽ không thể rời khỏi bảng cho đến khi tất cả các phiên ngắt kết nối.
Vì vậy, giải pháp thực sự là học cách sử dụng các bảng tạm thời toàn cục đúng cách:tạo các bảng tạm thời toàn cầu cụ thể để phù hợp với từng báo cáo. Hoặc, như tôi đã nói, hãy sử dụng các bộ sưu tập PL / SQL để thay thế. Hoặc, thậm chí, chỉ cần học cách viết SQL được điều chỉnh tốt. Thông thường, chúng tôi sử dụng các bảng tạm thời như một giải pháp thay thế cho một truy vấn được viết kém có thể được lưu bằng một đường dẫn truy cập tốt hơn.
Sau khi xem mã đầy đủ của bạn, luồng có vẻ kỳ lạ hơn:
- Thả và tạo lại một bảng tạm thời chung
- Điền bảng tạm thời
- Chọn từ bảng tạm thời vào mảng PL / SQL
- Chèn vào bảng thực tế bằng cách sử dụng chèn hàng loạt từ mảng PL / SQL
Có quá nhiều hoạt động lãng phí và chi phí ở đây. Tất cả những gì bạn cần làm là lấy dữ liệu bạn chèn vào v2d_temp
và điền trực tiếp vertical_design
, lý tưởng là với câu lệnh INSERT INTO ... SELECT * FROM. Bạn sẽ yêu cầu một số xử lý trước để chuyển đổi một mảng JSON thành một truy vấn nhưng điều đó rất dễ đạt được trong Java hoặc PL / SQL.
Tôi có vẻ chắc chắn rằng các bảng tạm thời chung không phải là giải pháp phù hợp cho trường hợp của bạn.
"sếp của chúng tôi hoặc những người khác cố gắng làm điều gì đó theo cách của họ, vì vậy bạn không thể thay đổi điều đó"
Những gì bạn gặp phải là Vấn đề về ông chủ không phải là Sự cố lập trình . Do đó, nó lạc đề cho đến khi StackOverflow đi. Nhưng dù sao đây cũng là một số gợi ý.
Điều quan trọng cần nhớ là chúng ta không nói về sự thỏa hiệp đối với một số kiến trúc dưới mức tối ưu:những gì sếp của bạn đề xuất rõ ràng sẽ không hoạt động trong môi trường nhiều người dùng. vì vậy, các tùy chọn của bạn là:
- Bỏ qua
ORA-14452
lỗi, tiến hành sản xuất và sau đó sử dụng biện pháp bảo vệ "nhưng bạn đã nói với tôi" khi mọi thứ trở nên sai lầm khủng khiếp. Đây là vở kịch yếu nhất. - Đảo rác các bảng toàn cục và triển khai một thứ gì đó sẽ hoạt động trong tình huống nhiều người dùng. Điều này có rủi ro cao vì bạn không có biện pháp bảo vệ nếu bạn làm hỏng việc triển khai.
- Nói chuyện với sếp của bạn. Cho họ biết bạn đang gặp phải
ORA-14452
lỗi, giả sử bạn đã thực hiện một số cuộc điều tra và có vẻ như có vấn đề cơ bản với việc sử dụng các bảng tạm thời toàn cầu theo kiểu này nhưng rõ ràng là bạn đã bỏ qua điều gì đó. Sau đó, hãy hỏi họ xem họ đã giải quyết vấn đề này như thế nào khi họ đã triển khai nó trước đây. Điều này có thể xảy ra theo nhiều cách, có thể họ có cách giải quyết khác, có thể họ sẽ nhận ra rằng đây là cách sai khi sử dụng các bảng tạm thời toàn cục, có thể họ sẽ bảo bạn bị lạc. Dù bằng cách nào thì đây cũng là cách tiếp cận tốt nhất:bạn đã nêu lên mối quan ngại ở mức độ phù hợp.
Chúc các bạn thành công.