programing

오라클 SQL Developer를 사용하여 텍스트 파일로 CLOB 내보내기

css3 2023. 9. 2. 08:45

오라클 SQL Developer를 사용하여 텍스트 파일로 CLOB 내보내기

Oracle SQL Developer를 사용하고 있으며 테이블을 CSV 파일로 내보내려고 합니다.일부 필드는 CLOB 필드이며, 대부분의 경우 내보내기가 수행될 때 항목이 잘립니다.제 최종 목표는 여기서 Oracle을 사용하지 않는 것이기 때문에 전체를 활용할 수 있는 방법을 찾고 있습니다(Oracle dump는 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이 CLOB를 처리하는 방법에 대해 전혀 알지 못하고 경험도 없습니다.

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(내보내기 또는 expdp에서)를 의미한다고 가정하면 이진 파일을 보는 것입니다.덤프 파일을 Oracle 데이터베이스로 가져온 다음 UTL_FILE 또는 다른 방법을 사용하여 데이터를 일반 텍스트로 내보내야 합니다.

다음은 CLOB 필드를 포함한 테이블을 플랫 csv 파일로 덤프하는 짧지만 일반적인 python 스크립트입니다.오라 덤프

Oracle SQL Developer가 명시적으로 언급되고 "해킹 유형의 솔루션"이 권장되었습니다(그리고 누군가가 여전히 필요한 경우).

SQL 워크시트(Oracle SQL Developer)에서 단일 문을 실행하면 결과가 표로 표시됩니다.결과 테이블을 누른 후 키보드 단축키 또는 편집 메뉴를 사용하여 먼저 전체 테이블을 표시한 다음 내용을 복사합니다.원하는 텍스트 편집기로 이동합니다.붙여넣기.파일에 저장합니다.끝났으면 좋겠습니다. ;-)

4000자를 초과하는 CLOB에서도 작동합니다.실제로 도움이 되든 안 되든 간에 CLOB의 실제 내용에 크게 좌우될 것입니다.때때로 SQL 사전 처리를 통해 이를 실현할 수도 있습니다.

또는 결과 테이블의 로컬 메뉴 Export...(내보내기...)를 시도합니다.여기서 Excel 95-2003 형식 옵션을 사용하면 CSV 또는 텍스트/TSV보다 더 효과적일 수 있습니다.

조정/자세한 내용이 필요한 경우 의견을 제시해 주십시오.

언급URL : https://stackoverflow.com/questions/1434443/exporting-a-clob-to-a-text-file-using-oracle-sql-developer