Ditt problem är att din fråga väljer några bokstavliga strängvärden utan att ställa in några alias:
select ..., 'IPU', ... , 'IPU', ..., 'EUR', ...
I ovanstående fall kommer Oracle att automatiskt generera fula alias som ser ut ungefär så här:
select ..., 'IPU' AS "'IPU'", ..., 'IPU' AS "'IPU'", ..., 'EUR' AS "'EUR'", ...
Så som du kan se har du nu 3 väldigt fula kolumnnamn som är väldigt besvärliga att arbeta med, och 2 av dem är dubbletter, vilket resulterar i felet du får.
Överväg att ge dem rätt distinkta alias för att undvika tvetydigheter. Detta är bara ett exempel, men du bör ge ett mer meningsfullt alias i enlighet med värdets betydelse:
select ..., 'IPU' AS some_col_1, ..., 'IPU' AS some_col_2, ..., 'EUR' AS some_col_3, ...
Det roliga är att du inte är det använder för närvarande dessa 3 värden när du läser frågan i din markör för loop. När du läser/slingrar genom din markör, istället för att försöka läsa de 3 värdena från markören, hårdkodar du helt enkelt värdena igen när du skriver ut dem.
Så faktiskt, om du verkligen inte bryr dig om att läsa de 3 värdena från markören, ta bara bort dem från frågan helt och hållet. Annars byt ut dina hårdkodade värden från din DBMS_OUTPUT.PUT_LINE(...)
med de alias som du ställt in.
Så när din fråga är åtgärdad, istället för:
DBMS_OUTPUT.PUT_LINE(... || 'IPU' || ... || 'IPU' || ... || 'EUR' || ...);
Du bör förmodligen använda markören så här:
DBMS_OUTPUT.PUT_LINE(... || De_Dub_rec.some_col_1 || ... || De_Dub_rec.some_col_2 || ... || De_Dub_rec.some_col_3 || ...);