Saran umum untuk memecahkan masalah kesalahan "Tidak ada lagi data untuk dibaca dari soket".
Kesalahan ini biasanya disebabkan oleh kesalahan serius lainnya, seperti kesalahan ORA-600. Masalah yang sangat serius sehingga proses server macet dan bahkan tidak dapat mengirim pesan kesalahan yang tepat ke klien. (Alasan umum lainnya untuk kesalahan ini adalah pemutusan jaringan yang disebabkan oleh SQLNET.EXPIRE_TIME atau proses lain yang mematikan sesi lama.)
Lihat Alert Log untuk mengetahui pesan kesalahan asli.
Cari file alert_[name].log di direktori ini:select value from v$parameter where name = 'background_dump_dest';
Setelah Anda menemukan pesan kesalahan dan detail spesifik, buka support.Oracle.com. Gunakan "alat ora-600" lalu cari nomor pertama setelah pesan ORA-600.
Biasanya akan ada satu atau lebih artikel untuk jenis kesalahan ORA-600 tertentu. Gunakan versi dan platform yang tepat untuk mempersempit kemungkinan daftar bug. (Tapi jangan kaget jika "Versi yang terpengaruh" dalam artikel itu salah. Klaim Oracle tentang "diperbaiki di versi x.y" tidak selalu benar.)
Artikel biasanya menjelaskan lebih detail bagaimana masalah terjadi, kemungkinan solusi, dan solusi yang biasanya melibatkan patch atau upgrade.
Dalam praktiknya, Anda jarang ingin menyelesaikan masalah-masalah ini. Saran "khas" adalah menghubungi Dukungan Oracle untuk memverifikasi bahwa Anda benar-benar memiliki masalah yang sama, mendapatkan tambalan, mendapatkan izin, dan menghapus lingkungan, lalu menerapkan tambalan. Dan kemudian mungkin menyadari bahwa tambalan tidak berfungsi. Selamat, Anda baru saja membuang banyak waktu.
Sebagai gantinya, Anda biasanya dapat menghindari masalah dengan perubahan halus pada kueri atau prosedur. Ada banyak fitur di Oracle, hampir selalu ada cara lain untuk melakukannya. Jika kode terlihat agak aneh, tambahkan komentar untuk memperingatkan pemrogram masa depan:"Kode ini terlihat aneh untuk menghindari bug X, yang harus diperbaiki di versi Y."
Saran khusus untuk kode ini
Jika itu benar-benar seluruh prosedur Anda, Anda harus menggantinya dengan sesuatu seperti ini:
insert into local.tab3(col1, col2, col3, col4)
select tab1.col1, tab1.col2, tab2.col1, tab2.col2
from [email protected] tab1
join [email protected] tab2
on tab1.col1 = tab2.col1
and tab1.col2 = tab2.col2;
Secara umum, Anda harus selalu melakukan hal-hal dalam SQL jika memungkinkan. Apalagi jika Anda bisa menghindari membuka banyak kursor. Dan terutama jika Anda dapat menghindari membuka banyak kursor ke database jarak jauh.