Pikirkan waktu pertanyaan lagi. Kali ini pertanyaan Oracle dan 'apa yang harus dilakukan jika Anda melihat kesalahan ora-06512'. Saya harus mengakui bahwa Oracle bukan milik saya tetapi saya tahu DBA yang ramah yang tinggal di dalam Oracle dan bersedia membantu saya menjawab pertanyaan ini dengan imbalan secangkir besar kopi.
Oracle adalah sistem manajemen basis data yang telah ada selama empat puluh tahun dalam berbagai bentuk. Ini awalnya digunakan sesuatu yang disebut skema SCOTT, dinamai salah satu karyawan asli Oracle. Anda bahkan masuk ke Oracle untuk pertama kalinya dengan nama pengguna 'scott' dan kata sandi 'macan' yang dinamai berdasarkan kucing Scott. Sekarang ada beberapa skema yang digunakan tergantung pada apa yang Anda gunakan untuk Oracle.
Jika Anda ingin mempelajari lebih lanjut tentang Oracle, halaman ini sangat berguna.
Memperbaiki kesalahan Ora-06512
Rupanya, kesalahan ora-06512 adalah kesalahan pengecualian umum yang memberitahu Anda di mana ada sesuatu yang salah, bukan apa yang salah.
Misalnya, sintaks kesalahan mungkin membaca:
ORA-01422: pengambilan tepat menghasilkan lebih dari jumlah baris yang diminta
ORA-06512: di "DATABASE_NAME", baris 66
ORA-06512: pada baris 1
Baris pertama memberi tahu Anda jenis kesalahan apa yang terjadi, dalam hal ini, kueri mengembalikan lebih banyak data daripada kueri yang diharapkan sehingga tidak tahu cara menanganinya. Kode 'ORA-01422' adalah kode kesalahan aktual yang perlu Anda perhatikan. ORA-06512 hanyalah kode kesalahan umum.
Baris kedua memberi tahu Anda di mana kesalahan itu terjadi. DATABASE_NAME akan menjadi basis data apa pun yang Anda kerjakan saat itu. Baris 66 adalah garis di mana kesalahan terjadi dan garis yang perlu Anda periksa untuk memperbaiki kesalahan.
Baris ketiga dalam sintaks kesalahan memberi tahu Anda dari mana panggilan itu berasal. Periksa baris pertama dan Anda akan melihat panggilan ke DATABASE_NAME.
Untuk memperbaiki kesalahan ini, Anda harus memperbaiki masalah yang disebabkan oleh ORA-01422, yang 'retur tepat mengembalikan lebih dari jumlah baris yang diminta' atau Anda perlu menambahkan pengendali pengecualian untuk memberitahu Oracle untuk mengabaikannya. Karena memperbaiki masalah inti selalu lebih baik, ini adalah cara untuk pergi.
Ada dua hal yang bisa Anda lakukan. Jika Anda mengharapkan kueri untuk mengembalikan lebih dari satu baris, Anda dapat memodifikasinya sehingga tidak akan terkejut. Jika Anda hanya mengharapkan kueri untuk mengembalikan satu baris, Anda dapat memodifikasinya untuk itu juga.
Mengharapkan lebih dari satu baris:
untuk X di (pilih * dari t di mana ...)
lingkaran
- proses rekam X di sini
lingkaran akhir;
Ini harus menghapus kesalahan dalam query database di mana lebih dari satu baris akan dikembalikan.
Jika Anda hanya mengharapkan satu baris untuk dikembalikan, Anda dapat mencoba:
mulai
pilih * ke….
dari t di mana….
proses….
pengecualian
ketika NO_DATA_FOUND lalu
kode penanganan kesalahan ketika tidak ada catatan yang ditemukan
ketika TOO_MANY_ROWS lalu
kode penanganan kesalahan ketika terlalu banyak catatan ditemukan
akhir;
Metode kedua ini hanya mengirimkan satu baris tanpa membuang 'ORA-01422: retur tepat mengembalikan lebih dari jumlah kesalahan baris yang diminta dan karena itu kesalahan ORA-06512 yang asli.
Anda juga dapat mengubah kueri sehingga hanya mengembalikan baris pertama dari beberapa jawaban baris. Ini mungkin berhasil jika Anda tidak memiliki kontrol penuh atas database atau tidak ingin mengacaukan banyak hal tetapi masih membutuhkan jawaban.
menyatakan
c1 kursor untuk pilih * dari t di mana ...
mulai
buka c1;
ambil c1 ke ..
jika (c1% notfound) lalu
penanganan kesalahan tanpa catatan ditemukan
berakhir jika;
tutup c1;
akhir;
Saya tidak bisa melihat yang terakhir ini dalam tindakan tetapi saya yakin bahwa dalam keadaan di mana banyak pengembalian dapat ditemukan tetapi Anda hanya ingin satu baris kembali dan tidak ada kesalahan, ini akan berhasil.
Saya tahu sedikit SQL, cukup untuk menulis pernyataan pilih dasar tetapi saya harus mengakui Oracle melemparkan saya. Meskipun PL / SQL sangat mirip, saya menemukan diri saya hilang. PL / SQL adalah bahasa prosedural Oracle ekstensi untuk SQL yang tampaknya memungkinkan untuk melakukan banyak hal lebih pintar daripada vanilla SQL. Saya menemukan ini PL / SQL FAQ berguna ketika mencoba untuk belajar tentang Oracle, mungkin membantu Anda juga.
Seperti yang telah saya sebutkan sebelumnya, saya bukan DBA dan hanya tahu sedikit tentang basis data spesifik. Saya telah melakukan yang terbaik untuk menyampaikan apa yang ditunjukkan oleh teman saya selama waktu singkat saya di mejanya dan di email berikutnya. Jika saya mendapatkan sesuatu yang sangat salah, beri tahu saya di bagian komentar.