【问题标题】:Exporting a CLOB to a text file using Oracle SQL Developer使用 Oracle SQL Developer 将 CLOB 导出到文本文件
【发布时间】:2010-11-28 21:34:27
【问题描述】:

我正在使用 Oracle SQL Developer 并尝试将表导出到 CSV 文件。一些字段是 CLOB 字段,并且在许多情况下,当导出发生时,条目会被截断。我正在寻找一种方法来解决整个问题,因为我的最终目标是不在这里使用 Oracle(我收到了一个 Oracle 转储 - 它已加载到一个 oracle 数据库中,但我正在使用另一种格式的数据,所以通过CSV 作为中介)。

如果对此有多种解决方案,鉴于这对我来说是一次性程序,我不介意使用更多的 hack-ish 类型的解决方案来解决更多涉及的“正确”解决方案。

【问题讨论】:

    标签: sql oracle clob oracle-sqldeveloper


    【解决方案1】:

    由于明确提到了 Oracle SQL Developer,并且鼓励使用“hack-ish 类型的解决方案”(如果有人仍然需要……):

    如果从 SQL 工作表(在 Oracle SQL Developer 中)执行单个语句,结果将显示为表格。 单击结果表后,使用键盘快捷键或编辑菜单首先标记整个表,然后复制其内容。 继续使用您选择的文本编辑器。粘贴。保存到文件。希望完成。 ;-)

    甚至适用于超过 4000 个字符的 CLOB。它是否真的有帮助,很大程度上取决于 CLOB 的实际内容。有时一些 SQL 预处理可能会让你到达那里……

    或者在结果表的本地菜单中尝试导出…。从那里通过 Excel 95-2003 格式选项可能会起作用(比 CSV 或文本/TSV 更好)。

    如果需要调整/进一步详细信息,请发表评论。

    【讨论】:

      【解决方案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
      

      仅供参考:Help installing cx_Oracle

      【讨论】:

        【解决方案3】:

        这里有一个简短但通用的 python 脚本,它可以做到这一点 - 将表(包括 CLOB 字段等)转储到一个平面 csv 文件:OraDump

        【讨论】:

          【解决方案4】:

          如果您可以访问数据库框上的文件系统,您可以执行以下操作:

          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。

          【讨论】:

          • UTL_FILE 可以很好地处理 CLOB,在 9i 和更高版本中,它就像处理 VARCHAR2。
          • 嗯,我无法访问那台机器,但如果我不能直接访问,我可能会吓到别人。
          • UTL_FILE 可以作为用户运行,我相信。
          • 关于使用它的任何提示,但记录集有多个记录(使用非隐式游标)
          • 嗨,你能帮我处理一下stackoverflow.com/questions/25279365/…吗?
          【解决方案5】:

          假设通过 Oracle 转储您的意思是 .dmp(来自导出或 expdp),您正在查看二进制文件。您需要将转储文件导入 Oracle 数据库,然后使用 UTL_FILE 或其他方式将数据导出为纯文本。

          【讨论】:

          • 它已经被加载到一个 oracle 数据库中,只是我的最终目标不是 oracle,所以我将我想要的位作为 CSV 提取并以这种方式处理它们。这一直有效,直到我遇到 CLOBs
          猜你喜欢
          • 2023-03-08
          • 1970-01-01
          • 2015-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多