让我们说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;
感谢。
答案 0 :(得分:0)
您不必手动键入所有列。只需使用describe 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;