我正在使用Oracle SQL Developer并尝试将表导出为CSV文件。某些字段是CLOB字段,在许多情况下,导出发生时会截断条目。我正在寻找一种方法来解决所有问题,因为我的最终目标是不在这里使用Oracle(我收到了一个Oracle转储 - 它被加载到一个oracle数据库中,但我正在使用其他格式的数据,所以通过CSV作为中介)。
如果有多种解决方案,鉴于对我来说这是一次性的程序,我不介意更多涉及“做正确”解决方案的黑客类型解决方案。
答案 0 :(得分:14)
如果您可以访问数据库框中的文件系统,则可以执行以下操作:
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;
/
我复制并粘贴了from this site。
您可能还会发现此previous question about UTL_FILE有用。它解决了导出到CSV的问题。但是,我不知道或不知道UTL_FILE如何处理CLOB。
答案 1 :(得分:2)
您可以使用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
答案 2 :(得分:0)
假设您通过Oracle转储表示.dmp(来自export或expdp),您正在查看二进制文件。您需要将dumpfile导入Oracle数据库,然后使用UTL_FILE或其他方式将数据导出为纯文本。
答案 3 :(得分:0)
这是一个简短而通用的python脚本,只执行此操作 - 将表(包含CLOB字段,其余部分)转储到平面csv文件:OraDump
答案 4 :(得分:0)
由于明确提到了Oracle SQL Developer,因此鼓励使用“黑客式解决方案”(以防仍然有人……):
如果从SQL工作表(在Oracle SQL Developer中)执行了一条语句,结果将显示为表格。 单击结果表后,使用键盘快捷键或 Edit 菜单首先标记整个表,然后复制其内容。 继续选择您的文本编辑器。糊。保存到文件。希望能完成。 ;-)
即使对于超过4000个字符的CLOB也可以使用。它是否真正有帮助,将在很大程度上取决于CLOB的实际内容。有时候,一些SQL预处理可能会带您到达那里……
或者尝试使用结果表的本地菜单导出... 。从那里通过 Excel 95-2003 格式选项可能会起作用(比CSV或text / TSV更好)。
如果且因为这需要调整/进一步的细节,请发表评论。