2017-01-19 1 views
0

내가 user_tab_table에 제출 한 일반적인 얻기 위해 SQL을 만들 수 있고, 항목을 참조하십시오 : 나는 열 문자열을 가지고 너무oracle sql에서 user_tab_columns 선택으로 열을 선택하는 방법은 무엇입니까?

select SUBSTR (SYS_CONNECT_BY_PATH (COLUMN_NAME , ','), 2) into str 
    from (select COLUMN_NAME , ROW_NUMBER() over (order by COLUMN_NAME) RN, 
       COUNT (*) OVER() cnt 
      from USER_TAB_COLUMNS 
      where TABLE_NAME in('tb1','tb2') 
      group by COLUMN_NAME 
      having COUNT(*) >= 2 
     ) 
WHERE rn = cnt 
start with RN = 1 
connect by RN = prior RN + 1; 

,하지만 그 후, 나는이에 적용 (또는 결합) 할 생각이 없다 sql :

select {result} 
from tb1 
order by filed2;  
union 
select {result} 
from tb2 
order by filed1; 

어떤 사람이 나에게 몇 가지 팁을 줄 수 있습니까? thx for ...

+1

내게 불분명 함. db1과 db2는 무엇입니까? SFS_APPLS 란 무엇입니까? –

+0

OK, 맞습니다 –

+0

동적으로 결정된 열의 행을 반환하는 PL/SQL 함수를 작성하려고합니까? 나는 이것이 가능하지 않다고 생각한다 - 적어도 SQL에서는 접근 할 수 없다. PL/SQL에 머무르는 한이 작업을 수행 할 수 있지만 그 결과로 수행 할 작업이 무엇인지 궁금합니다. 마지막 쿼리에서'ORDER BY' 절은 그 길에 불필요합니다. 그리고 어쨌든 filed1과 filed2는 무엇입니까? 이 열을 선택 하시겠습니까? 그리고 UNION은 결과에서 중복을 제거하기 위해 만들어진다. 이것은 정말로 의도 된 것입니까? 달성하고자하는 것을 알려주십시오. –

답변

0

다음은 tb1 및 tb2의 공통 열을 선택하는 쿼리의 커서를 가져 오는 PL/SQL 함수를 작성하는 방법입니다.

create or replace function get_common_columns 
    return sys_refcursor 
as 
    v_str  varchar2(10000); 
    v_sql  varchar2(10000); 
    v_cursor sys_refcursor; 
begin 
    select listagg(column_name, ',') within group(order by column_name) 
    into v_str 
    from 
    (
    select column_name 
    from user_tab_columns 
    where table_name in ('tb1', 'tb2') 
    group by column_name 
    having count(*) >= 2 
); 

    v_sql := 'select ' || v_str || ' from tb1 ' || 
      'union ' || 
      'select ' || v_str || ' from tb2 ' || 
      'order by ' || v_str; 

    open v_cursor for v_sql; 
    return v_cursor; 
end get_common_columns; 

결과만으로 무엇을 하시겠습니까? 죄송하지만 SQL에서 액세스 할 수 없습니다 (예 : select * from table(get_common_columns)이 작동하지 않음). PL/SQL 내부에서만 사용할 수 있습니다. 그리고 심지어 당신이 refcursor (즉, 어떤 열)에 무엇이 있는지 알아야하기 때문에 열심히 노력할 것입니다.

이렇게 말한 후에 완전히 다른 접근법을 사용하면서 갖고있는 것을 달성하고 싶을 수 있습니다.

+0

두 개의 테이블에 공통 열을 표시하고 싶지만 서로 다른 구조이므로 user_tab_columns에 공통 열을 가져와이 두 테이블의 행을 선택하고 싶습니다. –

+0

이것은 PL/SQL에서 매우 복잡합니다. 언급했듯이 표시된대로 refcursor를 사용할 수 있지만 refcursor에 대한 열 설명을 가져와 액세스해야합니다 (https://asktom.oracle.com/pls/asktom/f? p = 100 : 11 : 0 ::: P11_QUESTION_ID : 2109642600346678459), Java, C# 또는 다른 프로그래밍 언어를 사용하면 외부에서 훨씬 쉽게 할 수 있습니다. –

관련 문제