2014-02-26 3 views
0

SELECT 쿼리를 사용하여 선택할 어디 형태의 질문이에 :TABLENAME을 얻고 열이 나는 요구 사항이

select tab1.col1 as column1, tab2.col1 as column1 
from table1 tab1 inner join table2 tab2 on tab1.key1=tab2.key2 

나는이에서 세 가지를 좀하고 싶습니다 :

table1|col1|column1 
table2|col2|comumn2 

또한 가능하면 선택한 열의 데이터 유형을 가져오고 싶습니다.

이 작업은 수동으로 수행 할 수 있지만 2000 개를 초과하는 선택 쿼리가 있으며 각 쿼리는 100 개가 넘는 필드를 가져옵니다. 그래서 일은 지루하고 시간이 많이 걸립니다.

내가 어떻게 자동화 할 수 있는지에 대한 아이디어. 나는 오라클 SQL 개발자가 있으며 내 일을 담당한다면 유닉스 쉘 스크립트를 작성할 수 있습니다.

+0

를 사용하여 결과 열 정의를 얻을 수 있습니다 모든 쿼리가 간단합니까? 서브 쿼리, 인라인 쿼리, 대소 문자를 구분하지 않는 식별자 등은 없습니까? 정확히 어디서 질문을합니까? SQL 문의 테이블이 있습니까? 또는 저장 프로 시저에서 SQL 문을 구문 분석해야합니까? –

+0

이 간단한 쿼리는 없습니다. 여러 개의 조인과 조건이 있지만 select 절의 필드 만 필요하므로 우리를 괴롭히지 않아야합니다. 드문 경우지만 쿼리의 select 절에는 to_char 또는 upper와 같은 몇 가지 함수가 있습니다. 이 모든 쿼리는 UNiX의 디렉토리에 별도의 sql 파일 (하나의 파일 당 하나의 쿼리)에 저장됩니다. – user3357241

+0

글쎄, 당신은 'FROM' 절의 테이블 이름을 원하는 것처럼 보이기 때문에 구문 분석이 필요합니다. 어떤 SQL 하위 집합을 지원해야합니까? 인라인 쿼리? 조인의 하위 쿼리? 앨리어스 된 서브 쿼리의 다중 레이어? –

답변

0

dbms_sql을 사용하여 결과 열에 대한 설명을 얻을 수 있지만 어떤 테이블에서 왔는지 알려주지는 않습니다.

하지만 DBMS_SQL 당신은 커서 열 dbms_sql.parse()를 사용하여 SQL 문을 구문 분석 할 수

당신은 다음 DBMS_SQL.DESCRIBE_COLUMNS3

예를

set serveroutput on 
DECLARE 
    c INTEGER; 
    COL_CNT NUMBER; 
    DESC_T SYS.DBMS_SQL.DESC_TAB3; 
    col_desc sys.dbms_sql.desc_rec3; 
BEGIN 
    c := dbms_sql.open_cursor; 
    dbms_sql.parse(c,'select * from dual', dbms_sql.NATIVE); 

    DBMS_SQL.DESCRIBE_COLUMNS3(
     C => C, 
     COL_CNT => COL_CNT, 
     DESC_T => DESC_T 
    ); 
    DBMS_OUTPUT.PUT_LINE('COL_CNT = ' || COL_CNT); 

    FOR i IN DESC_T.FIRST .. DESC_T.LAST LOOP 
    col_desc := DESC_T(i); 
    DBMS_OUTPUT.PUT_line(col_desc.col_name); 
    END LOOP; 
    SYS.DBMS_SQL.CLOSE_CURSOR(c); 
END; 
/