Использование курсора с таблицей с повторяющимися именами столбцов

Допустим, у table1 есть столбцы a,b,c, а у table2 есть столбцы b,c,d.

После объединения двух таблиц, как следует перебирать «соединенные таблицы» с помощью курсора и извлекать, например, значение столбца b формы table1. Как я могу различать повторяющиеся имена столбцов?

Один из способов, который я нашел, — дать псевдонимы столбцам, но это означало бы, что мне придется вручную вводить все остальные столбцы оператора select *, даже если только один столбец будет иметь дубликат.

Есть ли что-то похожее на

for c in (select * from table1 join table2 on (...)) loop
     dbms_output.put_line(c.table1.b);
     dbms_output.put_line(c.table2.b);
end loop;

?

Спасибо.


person Toma Radu-Petrescu    schedule 08.02.2018    source источник
comment
зачем вам вообще использовать курсор, если вы можете решить его по заданному базовому решению?   -  person maSTAShuFu    schedule 09.02.2018


Ответы (1)


Вам не нужно вручную вводить все столбцы. Просто используйте описания table1 и table2 и скопируйте и вставьте имена столбцов, добавив запятые в конце и общий суффикс для таблиц. Для таких вещей вы можете использовать любые редакторы, такие как notepad++ или editplus. Это не так трудоемко, как может показаться.

Другой способ — построить запрос соединения, используя column_names из USER_TAB_COLUMNS. Затем вы можете использовать его для динамического открытия CURSOR в вашей программе.

WITH tab1 AS
(
         SELECT   listagg('t1.' ||column_name
                           ||' as '
                           ||column_name
                           ||'_t1' ,',') WITHIN GROUP ( ORDER BY ROWNUM )  
                           col_names FROM USER_TAB_COLUMNS WHERE TABLE_NAME IN ('TABLE1') ), 


            tab2 AS ( SELECT LISTAGG('t2.'||column_name||' AS '||column_name||'_t2',',') 
                                 within GROUP ( ORDER BY ROWNUM ) col_names
         FROM     user_tab_columns
         WHERE    table_name IN ('TABLE2') )
SELECT     'SELECT  '
                      || a.col_names
                      || nvl2(a.col_names, nvl2(b.col_names,',',NULL),NULL)
                      || b.col_names||' FROM TABLE1 t1 JOIN TABLE2 t2 ON t1.id = t2.id'
FROM       tab1 a
cross join tab2 b; 
person Kaushik Nayak    schedule 09.02.2018