Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Paksa Oracle Jatuhkan Tabel Temp Global

Tabel sementara global Oracle bukan objek sementara. Mereka adalah tabel tumpukan yang tepat. Kami membuatnya sekali dan sesi apa pun dapat menggunakannya untuk menyimpan data yang hanya dapat dilihat oleh sesi itu .

Aspek sementara adalah bahwa data tidak persisten di luar satu transaksi atau satu sesi. Detail implementasi utama adalah bahwa data ditulis ke tablespace sementara bukan permanen. Namun, data masih ditulis ke - dan dibaca dari - disk, sehingga ada biaya tambahan yang signifikan untuk penggunaan tabel sementara global.

Intinya adalah kita tidak seharusnya menjatuhkan dan membuat ulang tabel sementara. Jika Anda mencoba mem-port logika gaya SQL Server ke Oracle, maka Anda harus mempertimbangkan untuk menggunakan koleksi PL/SQL untuk menyimpan data sementara di dalam memori. Temukan lebih banyak lagi.

Penyebab spesifik ORA-14452 adalah bahwa kita tidak dapat menjatuhkan tabel sementara global yang memiliki persistensi cakupan sesi jika telah berisi data selama sesi. Bahkan jika meja saat ini kosong...

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>

Solusinya adalah mengakhiri sesi dan menyambungkan kembali, atau (agak aneh) memotong tabel lalu menjatuhkannya.

SQL> truncate table gtt23;

Table truncated.

SQL> drop table gtt23;

Table dropped.

SQL> 

Jika beberapa sesi lain menggunakan tabel sementara global - dan itu mungkin (karenanya global nomenklatur) maka Anda tidak akan dapat meninggalkan tabel sampai semua sesi terputus.

Jadi solusi sebenarnya adalah belajar menggunakan tabel sementara global dengan benar:buat tabel sementara global tertentu untuk mencocokkan setiap laporan. Atau, seperti yang saya katakan, gunakan koleksi PL/SQL sebagai gantinya. Atau, bahkan, hanya belajar menulis SQL yang disetel dengan baik. Seringkali kami menggunakan tabel sementara sebagai solusi untuk kueri yang ditulis dengan buruk yang dapat disimpan dengan jalur akses yang lebih baik.

Setelah melihat kode lengkap Anda, alurnya tampak lebih aneh:

  1. Lepaskan dan buat kembali tabel sementara global
  2. Mengisi tabel sementara
  3. Pilih dari tabel sementara ke dalam array PL/SQL
  4. Sisipkan ke tabel aktual menggunakan penyisipan massal dari array PL/SQL

Ada begitu banyak overhead dan aktivitas yang sia-sia di sini. Yang perlu Anda lakukan adalah mengambil data yang Anda masukkan ke v2d_temp dan langsung mengisi vertical_design , idealnya dengan pernyataan INSERT INTO ... SELECT * FROM. Anda akan memerlukan beberapa pra-pemrosesan untuk mengonversi larik JSON menjadi kueri, tetapi hal itu mudah dilakukan di Java atau PL/SQL.

Sepertinya saya yakin bahwa tabel sementara global bukanlah solusi yang tepat untuk skenario Anda.

"bos kami atau orang lain tetap melakukan sesuatu dengan cara mereka, jadi Anda tidak dapat mengubahnya"

Apa yang Anda miliki adalah Masalah Bos bukan Masalah Pemrograman . Akibatnya itu di luar topik sejauh StackOverflow berjalan. Tapi tetap ada beberapa saran.

Hal utama yang perlu diingat adalah bahwa kita tidak berbicara tentang kompromi pada beberapa arsitektur sub-optimal:apa yang diusulkan atasan Anda jelas tidak akan berhasil dalam lingkungan multi-pengguna. jadi, pilihan Anda adalah:

  1. Abaikan ORA-14452 kesalahan, lanjutkan ke produksi dan kemudian gunakan pertahanan "tetapi Anda menyuruh saya" ketika semuanya berjalan sangat salah. Ini adalah permainan terlemah.
  2. Diam-diam membuang tabel global dan mengimplementasikan sesuatu yang akan bekerja dalam skenario multi-pengguna. Ini berisiko tinggi karena Anda tidak memiliki pertahanan jika Anda merusak implementasinya.
  3. Bicaralah dengan bos Anda. Beri tahu mereka bahwa Anda mengalami ORA-14452 kesalahan, katakanlah Anda telah melakukan beberapa penyelidikan dan tampaknya ada masalah mendasar dengan menggunakan tabel sementara global dengan cara ini, tetapi jelas Anda telah mengabaikan sesuatu. Kemudian, tanyakan kepada mereka bagaimana mereka mengatasi masalah ini ketika mereka telah menerapkannya sebelumnya. Ini bisa melalui beberapa cara, mungkin mereka memiliki solusi, mungkin mereka akan menyadari bahwa ini adalah cara yang salah untuk menggunakan tabel sementara global, mungkin mereka akan memberitahu Anda untuk tersesat. Bagaimanapun, ini adalah pendekatan terbaik:Anda telah menyampaikan kekhawatiran ke tingkat yang sesuai.

Semoga berhasil.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Paksa Oracle Jatuhkan Tabel Temp Global

  2. Sertifikasi Oracle

  3. Oracle 12.2 Sharding

  4. Konversi Unixtime ke Datetime SQL (Oracle)

  5. Kriteria Hibernasi untuk Tanggal