将游标与具有重复列名称的表一起使用

时间:2018-02-08 22:25:24

标签: sql oracle plsql cursor

让我们说table1abctable2bcd

加入这两个表之后,如何迭代已加入的表格'例如,使用光标和提取,列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;

感谢。

1 个答案:

答案 0 :(得分:0)

您不必手动键入所有列。只需使用describe table1table2并通过在末尾添加逗号和表的公共后缀来复制粘贴列名。您可以使用任何编辑器,如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;