문제

Oracle SQL Developer를 사용하고 있으며 테이블을 CSV 파일로 내보내려고 합니다.일부 필드는 CLOB 필드이며 대부분의 경우 내보내기가 수행될 때 항목이 잘립니다.내 최종 목표는 여기에서 Oracle을 사용하지 않는 것이므로 모든 것을 얻을 수 있는 방법을 찾고 있습니다. (Oracle 덤프를 받았습니다. 이는 oracle db에 로드되었지만 데이터를 다른 형식으로 사용하고 있으므로 다음을 통해 진행합니다. 중개자로서의 CSV).

이에 대한 솔루션이 여러 개 있는 경우 이것이 나에게 일회성 절차라는 점을 감안할 때 더 복잡한 "올바른" 솔루션에 대한 더 해킹적인 유형의 솔루션은 신경 쓰지 않습니다.

도움이 되었습니까?

해결책

데이터베이스 상자의 파일 시스템에 액세스 할 수있는 경우 다음과 같은 작업을 수행 할 수 있습니다.

CREATE OR REPLACE DIRECTORY documents AS 'C:\';
SET SERVEROUTPUT ON
DECLARE
  l_file    UTL_FILE.FILE_TYPE;
  l_clob    CLOB;
  l_buffer  VARCHAR2(32767);
  l_amount  BINARY_INTEGER := 32767;
  l_pos     INTEGER := 1;
BEGIN
  SELECT col1
  INTO   l_clob
  FROM   tab1
  WHERE  rownum = 1;

  l_file := UTL_FILE.fopen('DOCUMENTS', 'Sample2.txt', 'w', 32767);

  LOOP
    DBMS_LOB.read (l_clob, l_amount, l_pos, l_buffer);
    UTL_FILE.put(l_file, l_buffer);
    l_pos := l_pos + l_amount;
  END LOOP;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.put_line(SQLERRM);
    UTL_FILE.fclose(l_file);
END;
/

내가 복사하고 붙여 넣었다 이 사이트에서.

당신은 또한 이것을 찾을 수 있습니다 utl_file에 대한 이전 질문 유용한. CSV로의 수출을 다룹니다. 그러나 UTL_File이 클로브를 처리하는 방법에 대해 전혀 전혀 전혀 없습니다.

다른 팁

Python 스크립트를 사용하여 내보내기를 처리할 수 있으며 CLOB는 잘리지 않습니다.

from __future__ import print_function
from __future__ import division

import time
import cx_Oracle

def get_cursor():
    '''
    Get a cursor to the database
    '''
    # https://stackoverflow.com/questions/24149138/cx-oracle-doesnt-connect-when-using-sid-instead-of-service-name-on-connection-s
    # http://www.oracle.com/technetwork/articles/dsl/prez-python-queries-101587.html
    ip = '' # E.g. '127.0.0.1'
    port = '' # e.g. '3306'
    sid = ''
    dsnStr = cx_Oracle.makedsn(ip, port, sid)
    username = '' # E.g. 'FRANCK'
    password = '' # E.g. '123456'
    db = cx_Oracle.connect(user=username, password=password, dsn=dsnStr)    
    cursor = db.cursor()
    return cursor

def read_sql(filename):
    '''
    Read an SQL file and return it as a string
    '''
    file = open(filename, 'r')
    return ' '.join(file.readlines()).replace(';', '')

def execute_sql_file(filename, cursor, verbose = False, display_query = False):
    '''
    Execute an SQL file and return the results
    '''
    sql = read_sql(filename)
    if display_query: print(sql)
    start = time.time()
    if verbose: print('SQL query started... ', end='')
    cursor.execute(sql)
    if verbose: 
        end = time.time()
        print('SQL query done. (took {0} seconds)'.format(end - start))
    return cursor


def main():
    '''
    This is the main function
    '''
    # Demo:
    cursor = get_cursor()
    sql_filename = 'your_query.sql' # Write your query there
    cursor = execute_sql_file(sql_filename, cursor, True)    
    result_filename = 'result.csv'   # Will export your query result there
    result_file = open(result_filename, 'w')
    delimiter = ','    
    for row in cursor:
        for count, column in enumerate(row):
            if count > 0: result_file.write(delimiter)
            result_file.write(str(column))
        result_file.write('\n')
    result_file.close()


if __name__ == "__main__":
    main()
    #cProfile.run('main()') # if you want to do some profiling

참고: cx_Oracle 설치 도움말

Oracle 덤프에 의해 .dmp (Export 또는 ExpDP에서)를 의미한다고 가정하면 이진 파일을보고 있습니다. 덤프 파일을 Oracle 데이터베이스로 가져온 다음 UTL_FILE 또는 기타 수단을 사용하여 데이터를 일반 텍스트로 내보내야합니다.

다음은 짧지 만 일반적인 Python 스크립트입니다.이 덤핑 테이블 (나머지 클로브 필드 포함)을 플랫 CSV 파일로 수행합니다. oradump

Oracle SQL 개발자가 명시 적으로 언급되고 "Hack-ish Type Solutions"가 장려되었습니다 (그리고 누군가가 여전히 필요한 경우…) :

SQL 워크 시트 (Oracle SQL Developer)에서 단일 명령문이 실행되면 결과가 테이블로 표시됩니다. 결과 테이블을 클릭 한 후 키보드 바로 가기 또는 편집하다 먼저 전체 테이블을 표시 한 다음 콘텐츠를 복사합니다. 선택의 텍스트 편집기로 진행하십시오. 반죽. 파일에 저장하십시오. 바라건대 완료. ;-)

4000자를 초과하는 클로브의 경우에도 작동합니다. 실제로 도움이되는지 여부는 클로브의 실제 콘텐츠에 크게 의존합니다. 때로는 일부 SQL 사전 처리가 당신을 데려 갈 수 있습니다…

또는 결과 테이블의 로컬 메뉴에서 시도하십시오 내보내다…. 거기에서 Excel 95-2003 형식 옵션이 작동 할 수 있습니다 (CSV 또는 텍스트/TSV보다 낫다).

조정 / 추가 세부 사항이 필요한 경우 의견을 제시하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top