오라클 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
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
'programing' 카테고리의 다른 글
MySQL 점 유형의 좌표 검색 (0) | 2023.09.02 |
---|---|
A잭스가 bootstrap-select와 함께 작동하지 않음 (0) | 2023.09.02 |
SQL - 각 레코드에 대한 Call Stored Procedure (0) | 2023.09.02 |
수직 중심화 부트스트랩 모달 창 (0) | 2023.09.02 |
"그 요청은 크기 때문에 거절되었습니다." 스프링, 톰캣 (0) | 2023.09.02 |