2017-12-15 5 views
1

그래서 저장 프로 시저를 통해 실행하고 쿼리의 출력을 CSV 파일로 내보내려는 쿼리가 있습니다. 그러나 마지막 열 이름은 내가 그것을 할 다음 저장 프로 시저를 사용하고 printed.So 받고되지 않습니다oracle 저장 프로 시저에서 쿼리 결과를 csv로 내 보냅니다. 마지막 열 이름이 인쇄되지 않습니다.

create or replace PROCEDURE parseCSV(

p_file_name  VARCHAR2, -- filename 
p_sql_query  VARCHAR2, -- select * from table or some such query 
p_delimiter  CHAR,  -- column delimiter 
p_file_dir   VARCHAR2 -- Oracle directory name 
) 
AS 

    l_cursor_handle INTEGER; 
    l_dummy    NUMBER; 
    l_col_cnt   INTEGER; 
    l_rec_tab   DBMS_SQL.DESC_TAB; 
    l_current_col  NUMBER(16); 
    l_current_line VARCHAR2(2047); 
    l_column_value VARCHAR2(300); 
    l_file_handle  UTL_FILE.FILE_TYPE; 
    l_print_text  VARCHAR2(100); 
    l_record_count NUMBER(16) := 0; 

    BEGIN 
     l_file_handle := UTL_FILE.FOPEN(p_file_dir, p_file_name, 'a', 2047); 
     l_cursor_handle := DBMS_SQL.OPEN_CURSOR; 
     DBMS_SQL.PARSE(l_cursor_handle, p_sql_query, DBMS_SQL.native); 
     l_dummy := DBMS_SQL.EXECUTE(l_cursor_handle); 
     DBMS_SQL.DESCRIBE_COLUMNS(l_cursor_handle, l_col_cnt, l_rec_tab); 
     dbms_output.put_line(l_col_cnt); 
     l_current_col := l_rec_tab.FIRST; 
     dbms_output.put_line(l_current_col); 

     IF (l_current_col IS NOT NULL) THEN 
      LOOP 
      DBMS_SQL.DEFINE_COLUMN(l_cursor_handle, l_current_col, l_column_value, 300); 

      l_print_text := l_rec_tab(l_current_col).col_name || 
      p_delimiter; 
      l_current_col := l_rec_tab.NEXT(l_current_col); 
      IF l_current_col IS NULL/*handling for last delimiter for 
      column */ 
      THEN 
      l_print_text:=substr(l_print_text,-1); 
      END IF; 
      UTL_FILE.PUT (l_file_handle, l_print_text); 
      EXIT WHEN (l_current_col IS NULL); 
      END LOOP; 
     END IF; 
     UTL_FILE.PUT_LINE (l_file_handle,' '); 
     LOOP 
      EXIT WHEN DBMS_SQL.FETCH_ROWS(l_cursor_handle) = 0; 

      l_current_line := ''; 
      FOR l_current_col IN 1..l_col_cnt LOOP 
      DBMS_SQL.COLUMN_VALUE (l_cursor_handle, l_current_col, l_column_value); 
      l_print_text := l_column_value || p_delimiter; 
      IF l_current_col =l_col_cnt 
      then 
      l_current_line := l_current_line || l_column_value; 
      ELSE 
      l_current_line := l_current_line || l_column_value || 
      p_delimiter; 
      END IF; 
      END LOOP; 
      l_record_count := l_record_count + 1; 
      UTL_FILE.PUT_LINE (l_file_handle, l_current_line); 
     END LOOP; 
     UTL_FILE.FCLOSE (l_file_handle); 
     DBMS_SQL.CLOSE_CURSOR(l_cursor_handle); 
    END; 

절차를 다음 실행 프로세스 쿼리와는 구분 된 파일에 결과를 저장합니다. 그러나 마지막 열 이름은

ID NAME  DEPT_ID DEPT  
    1 Prathick 55  FSU India 
    2 Sunny  55  FSU Japan 
    3 Muthu  55  FSU India 
    4 Manoj  55  FSU Japan 

예상 출력 ...

ID NAME  DEPT_ID DEPT Country 
    1 Prathick 55  FSU  India 
    2 Sunny  55  FSU  Japan 
    3 Muthu  55  FSU  India 
    4 Manoj  55  FSU  Japan 

Could someone please help me..I am new to oracle.I would really appreciate it 
+2

도움이 필요한 경우 여기에서 refcursor를 구문 분석하고 CSV 출력을 생성하는 작업 예제가 있습니다. http://www.williamrobertson.net/documents/refcursor-to-csv.shtml –

답변

2

SUBSTR('abcdefg,', -1) = ',' 없습니다. 나는 이것이 당신이 정말로 의미했던 것이라고 생각하지 않습니다. 당신의 열 인쇄 루프에서

, 행운을 빕니다

l_print_text := SUBSTR(l_print_text, 1, LENGTH(l_print_text)-1); 

l_print_text:=substr(l_print_text,-1); 

를 교체합니다.

+0

감사합니다 ... 작동합니다 –

관련 문제