Vấn đề của bạn là truy vấn của bạn đang chọn một vài giá trị chuỗi theo nghĩa đen mà không đặt bất kỳ bí danh nào:
select ..., 'IPU', ... , 'IPU', ..., 'EUR', ...
Trong trường hợp trên, Oracle sẽ tự động tạo các bí danh xấu xí trông giống như sau:
select ..., 'IPU' AS "'IPU'", ..., 'IPU' AS "'IPU'", ..., 'EUR' AS "'EUR'", ...
Vì vậy, như bạn có thể thấy, bạn hiện có 3 tên cột rất xấu, rất khó xử lý và 2 trong số đó bị trùng lặp, dẫn đến lỗi bạn đang gặp phải.
Hãy cân nhắc đặt cho họ những bí danh riêng biệt phù hợp để tránh sự mơ hồ. Đây chỉ là một ví dụ, nhưng bạn nên đặt một bí danh có ý nghĩa hơn theo ý nghĩa của giá trị:
select ..., 'IPU' AS some_col_1, ..., 'IPU' AS some_col_2, ..., 'EUR' AS some_col_3, ...
Điều buồn cười là bạn không hiện đang sử dụng 3 giá trị đó khi đọc truy vấn trong vòng lặp for con trỏ của bạn. Khi đọc / lặp qua con trỏ của bạn, thay vì cố gắng đọc 3 giá trị từ con trỏ, bạn chỉ cần mã hóa các giá trị một lần nữa khi bạn đang in chúng ra.
Vì vậy, trên thực tế, nếu bạn thực sự không quan tâm đến việc đọc 3 giá trị từ con trỏ, chỉ cần xóa chúng khỏi truy vấn hoàn toàn. Nếu không, hãy thay thế các giá trị được mã hóa cứng từ DBMS_OUTPUT.PUT_LINE(...)
của bạn với bí danh mà bạn đặt.
Vì vậy, khi truy vấn của bạn được sửa, thay vì:
DBMS_OUTPUT.PUT_LINE(... || 'IPU' || ... || 'IPU' || ... || 'EUR' || ...);
Bạn có thể nên sử dụng con trỏ như sau:
DBMS_OUTPUT.PUT_LINE(... || De_Dub_rec.some_col_1 || ... || De_Dub_rec.some_col_2 || ... || De_Dub_rec.some_col_3 || ...);