Seu problema é que sua consulta está selecionando alguns valores de string literais sem definir nenhum alias:
select ..., 'IPU', ... , 'IPU', ..., 'EUR', ...
No caso acima, o Oracle gerará automaticamente aliases feios que se parecem com isso:
select ..., 'IPU' AS "'IPU'", ..., 'IPU' AS "'IPU'", ..., 'EUR' AS "'EUR'", ...
Então, como você pode ver, agora você tem 3 nomes de coluna muito feios que são muito difíceis de trabalhar, e 2 deles são duplicados, resultando no erro que você está recebendo.
Considere dar a eles aliases distintos apropriados para evitar a ambiguidade. Este é apenas um exemplo, mas você deve fornecer um alias mais significativo de acordo com o significado do valor:
select ..., 'IPU' AS some_col_1, ..., 'IPU' AS some_col_2, ..., 'EUR' AS some_col_3, ...
O engraçado é que você não atualmente usando esses 3 valores ao ler a consulta em seu cursor para loop. Ao ler/percorrer o cursor, em vez de tentar ler os 3 valores do cursor, você simplesmente codifica os valores novamente enquanto os imprime.
Então, na verdade, se você realmente não se importa em ler os 3 valores do cursor, basta removê-los da consulta. Caso contrário, substitua seus valores codificados de seu
DBMS_OUTPUT.PUT_LINE(...)
com os aliases que você definiu. Então, quando sua consulta for corrigida, em vez de:
DBMS_OUTPUT.PUT_LINE(... || 'IPU' || ... || 'IPU' || ... || 'EUR' || ...);
Você provavelmente deve usar o cursor assim:
DBMS_OUTPUT.PUT_LINE(... || De_Dub_rec.some_col_1 || ... || De_Dub_rec.some_col_2 || ... || De_Dub_rec.some_col_3 || ...);