Masalah Anda adalah kueri Anda memilih beberapa nilai string literal tanpa menyetel alias apa pun:
select ..., 'IPU', ... , 'IPU', ..., 'EUR', ...
Dalam kasus di atas, Oracle akan secara otomatis membuat alias jelek yang terlihat seperti ini:
select ..., 'IPU' AS "'IPU'", ..., 'IPU' AS "'IPU'", ..., 'EUR' AS "'EUR'", ...
Jadi seperti yang Anda lihat, Anda sekarang memiliki 3 nama kolom yang sangat jelek yang sangat canggung untuk digunakan, dan 2 di antaranya adalah duplikat, yang mengakibatkan kesalahan yang Anda dapatkan.
Pertimbangkan untuk memberi mereka alias berbeda yang tepat untuk menghindari ambiguitas. Ini hanya contoh, tapi sebaiknya berikan alias yang lebih bermakna sesuai dengan arti nilainya:
select ..., 'IPU' AS some_col_1, ..., 'IPU' AS some_col_2, ..., 'EUR' AS some_col_3, ...
Lucunya adalah Anda tidak saat ini menggunakan 3 nilai tersebut saat membaca kueri di kursor Anda untuk loop. Saat membaca/mengulang kursor Anda, alih-alih mencoba membaca 3 nilai dari kursor, Anda cukup membuat kode ulang nilai-nilai tersebut saat Anda mencetaknya.
Jadi sebenarnya, jika Anda benar-benar tidak peduli membaca 3 nilai dari kursor, hapus saja dari kueri. Jika tidak, ganti nilai hard-code Anda dari DBMS_OUTPUT.PUT_LINE(...)
Anda dengan alias yang Anda tetapkan.
Jadi, setelah kueri Anda diperbaiki, alih-alih:
DBMS_OUTPUT.PUT_LINE(... || 'IPU' || ... || 'IPU' || ... || 'EUR' || ...);
Anda mungkin harus menggunakan kursor seperti ini:
DBMS_OUTPUT.PUT_LINE(... || De_Dub_rec.some_col_1 || ... || De_Dub_rec.some_col_2 || ... || De_Dub_rec.some_col_3 || ...);