Anonim

Pangkalan data pangkalan data akan mengiktiraf nama Oracle sebagai pusat kuasa dalam dunia sistem pengurusan pangkalan data relasi (DBMS). Oracle telah menghasilkan penyelesaian DBMS berkuasa tinggi selama beberapa dekad dan kekal sebagai pemimpin di lapangan. Ramai pengguna akhir produk pangkalan data mungkin bingung atau bingung apabila mereka menggunakan penyelesaian yang direka bentuk dan ia menghasilkan mesej ralat. Satu mesej ralat umum yang dihasilkan oleh Oracle adalah ralat ORA-06512.

Juga lihat artikel kami Bagaimana Untuk Perbaiki Kesalahan ora-00942

Oracle adalah sistem pengurusan pangkalan data yang telah wujud selama empat puluh tahun dalam pelbagai bentuk. Ia pada asalnya menggunakan sesuatu yang disebut skema SCOTT, dinamakan sempena salah seorang pekerja asal Oracle. Anda bahkan masuk ke Oracle untuk kali pertama dengan nama pengguna 'scott' dan kata 'harimau' yang dinamai kucing Scott. Kini terdapat beberapa skema yang digunakan bergantung pada apa yang anda gunakan untuk Oracle.

Jika anda ingin mengetahui lebih lanjut tentang Oracle dari bawah, laman ini sangat berguna.

Memperbaiki ralat ORA-06512

Dalam Oracle, ralat ORA-06512 adalah ralat pengecualian umum yang memberitahu anda di mana ada sesuatu yang salah. Ia adalah salah satu daripada kesilapan yang tidak diketahui khusus yang dihasilkan oleh Oracle, kerana ia memberitahu anda hanya ada masalah, tetapi bukan apa yang salah.

Sebagai contoh, mesej ralat biasa mungkin dibaca:

"ORA-01422: pengambilan tepat mengembalikan lebih daripada bilangan baris yang diminta

ORA-06512: pada "DATABASE_NAME", baris 66

ORA-06512: pada baris 1 "

Baris pertama memberitahu anda apa jenis ralat yang berlaku, dalam kes ini, pertanyaan itu mengembalikan lebih banyak data daripada permintaan yang dijangka sehingga tidak tahu bagaimana untuk mengatasinya. Kod 'ORA-01422' ialah kod ralat sebenar yang perlu anda lihat. ORA-06512 hanyalah kod ralat umum.

Baris kedua memberitahu anda di mana ralat berlaku. DATABASE_NAME akan menjadi pangkalan data apa yang sedang anda kerjakan pada masa itu. Talian 66 ialah garis di mana ralat sedang berlaku dan garis yang anda perlukan untuk menyemak untuk membetulkan ralat.

Baris ketiga dalam sintaks ralat memberitahu anda di mana panggilan datang. Semak baris satu dan anda akan melihat panggilan ke DATABASE_NAME.

Untuk membetulkan kesilapan ini, anda perlu membetulkan masalah yang disebabkan oleh ORA-01422, iaitu 'pengambilan tepat mengembalikan lebih daripada bilangan baris yang diminta' atau anda perlu menambah pengecualian untuk memberitahu Oracle untuk mengabaikannya. Seperti menetapkan isu teras selalu lebih baik, ini adalah cara untuk pergi.

Terdapat dua perkara yang boleh anda lakukan. Sekiranya anda menjangkakan pertanyaan itu akan kembali lebih daripada satu baris, anda boleh mengubahnya supaya tidak terkejut. Jika anda hanya mengharapkan pertanyaan untuk mengembalikan satu baris, anda boleh mengubahnya untuk itu juga.

Mengharapkan lebih daripada satu baris:

untuk X dalam (pilih * dari t di mana …)

gelung

- memproses rekod X di sini

gelung akhir;

Ini harus menghapuskan kesilapan dalam pertanyaan pangkalan data di mana lebih daripada satu baris akan dikembalikan.

Jika anda hanya mengharapkan satu baris untuk dipulangkan, anda boleh cuba:

mulakan

pilih * ke ….

dari mana ….

proses….

pengecualian

apabila NO_DATA_FOUND kemudian

kod pengendalian ralat semasa tiada rekod ditemui

ketika TOO_MANY_ROWS kemudiannya

kod pengendalian ralat semasa terlalu banyak rekod ditemui

akhir;

Kaedah kedua ini harus menyampaikan hanya satu baris tanpa melemparkan 'ORA-01422: pulangan tepat tepat melebihi ralat bilangan baris yang diminta' dan oleh itu ralat ORA-06512 asal.

Anda juga boleh tweak pertanyaan supaya ia hanya mengembalikan baris pertama jawapan berbilang baris. Ini mungkin berfungsi jika anda tidak mempunyai kawalan lengkap ke pangkalan data atau tidak mahu terlalu banyak perkara tetapi masih memerlukan jawapan.

mengisytiharkan

c1 cursor untuk pilih * dari t di mana …

mulakan

buka c1;

ambil c1 ke ..

jika (c1% notfound) maka

pengendalian ralat untuk tiada rekod yang dijumpai

akhir jika;

tutup c1;

akhir;

(Jika anda tahu SQL, anda mungkin sedikit keliru dengan baris arahan ini … Oracle tidak menggunakan Transact-SQL tetapi sebaliknya ia mempunyai lanjutan bahasa prosedural sendiri SQL, PL / SQL Walaupun bersamaan dengan Transact-SQL, PL / SQL tidak banyak perkara yang pandai dan merupakan alat yang sangat kuat di dalamnya sendiri. Anda mungkin mendapati FAQ PL / SQL ini berguna ketika cuba mempelajari Oracle.)

Oleh itu, pelajaran asas di sini adalah daripada kesilapan ORA-06512, dalam dan dari dirinya sendiri, bukan sesuatu yang anda boleh membetulkan secara langsung. Sebaliknya anda perlu memikirkan apa ralat sebenar, yang mana kod ralat lain akan memberitahu anda, dan kemudian alamat kesalahan itu satu demi satu.

Adakah anda mempunyai sebarang tip atau trik Oracle untuk dikongsi? Marilah kita tahu tentang mereka dalam komen!

Bagaimana untuk membaiki ralat ora-06512 dalam oracle db