Проблемът ви е, че заявката ви избира няколко стойности на литерален низ, без да задава никакви псевдоними:
select ..., 'IPU', ... , 'IPU', ..., 'EUR', ...
В горния случай Oracle автоматично ще генерира грозни псевдоними, които изглеждат по следния начин:
select ..., 'IPU' AS "'IPU'", ..., 'IPU' AS "'IPU'", ..., 'EUR' AS "'EUR'", ...
Така че, както можете да видите, сега имате 3 много грозни имена на колони, с които е много неудобно да се работи, и 2 от тях се дублират, което води до грешката, която получавате.
Помислете дали да им дадете подходящи различни псевдоними, за да избегнете неяснотата. Това е само пример, но трябва да дадете по-смислен псевдоним според значението на стойността:
select ..., 'IPU' AS some_col_1, ..., 'IPU' AS some_col_2, ..., 'EUR' AS some_col_3, ...
Най-смешното е, че виенесте в момента използва тези 3 стойности, когато чете заявката във вашия курсорен цикъл за. Когато четете/минавате през курсора, вместо да се опитвате да прочетете 3-те стойности от курсора, вие просто кодирате отново стойностите, докато ги отпечатвате.
Така че всъщност, ако наистина не ви е грижа да четете 3-те стойности от курсора, просто ги премахнете напълно от заявката. В противен случай заменете вашите твърдо кодирани стойности от вашия DBMS_OUTPUT.PUT_LINE(...)
с псевдонимите, които сте задали.
Така че след като заявката ви бъде коригирана, вместо:
DBMS_OUTPUT.PUT_LINE(... || 'IPU' || ... || 'IPU' || ... || 'EUR' || ...);
Вероятно трябва да използвате курсора така:
DBMS_OUTPUT.PUT_LINE(... || De_Dub_rec.some_col_1 || ... || De_Dub_rec.some_col_2 || ... || De_Dub_rec.some_col_3 || ...);