ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – 将SQL表数据格式化为文本表

2019-09-29 16:24:06  阅读:200  来源: 互联网

标签:mysql oracle format formatting


我有Oracle数据库的结果如下:

1   Chi Phí Lương   FA_Phan_Bo_Chi_Phi_Luong    8   JOHN    8   2015    (BLOB)  FA_Phan_Bo_Chi_Phi_Luong_Final.csv  09-NOV-15   Đã Hoàn Thành
2   Tổng Hợp TimeSheet Nhân Viên    FA_Tong_Hop_Timesheet   8   JOHN    8   2015    (BLOB)  FA_Tong_Hop_Timesheet_COM_Final.csv 09-NOV-15   Đã Hoàn Thành
3   Tổng Hợp Doanh Thu  FA_Tong_Hop_Doanh_Thu   8   JOHN    8   2015    (BLOB)  FA_Tong_Hop_Doanh_Thu_Final.csv 09-NOV-15   Đã Hoàn Thành
4   Chi Phí Hoạt Động Công Ty   FA_CP_Hoat_Dong 8   JOHN    8   2015    (BLOB)  FA_CP_Hoat_Dong_Final.csv   09-NOV-15   Đã Hoàn Thành
5   Khấu Hao Máy Móc Thiết Bị   FA_CP_Khau_Hao_Phan_Bo_MMTB 8   JOHN    8   2015    (BLOB)  FA_CP_Khau_Hao_Phan_Bo_MMTB_Final.csv   09-NOV-15   Đã Hoàn Thành

如何将文本格式化为具有相同宽度列的表格?

解决方法:

如果您正在使用SQLPlus或TOAD或SQLNavigator或SQL * Developer等,请使用您正在使用的功能来很好地格式化输出.

如果您正在寻找纯数据库解决方案(没有客户端),我会使用DBMS_SQL.这是基本代码(如下).此版本只是将结果集写入DBMS_OUTPUT.您可以将其更改为您想要的任何内容.此外,您需要扩展它以处理NUMBER,DATE和VARCHAR2之外的数据类型.

DECLARE
  l_rc SYS_REFCURSOR;

-- This is the procedure to format cursor output nicely
  PROCEDURE dump_cursor( p_rc IN OUT SYS_REFCURSOR) IS
    -- Dump the results of p_rc to log

    l_cursor                INTEGER;
    l_column_count          INTEGER;
    l_column_descriptions   sys.DBMS_SQL.desc_tab;
    l_status                INTEGER;
    l_column_value          VARCHAR2 (4000);
    l_column_width          NUMBER;
    l_rec_count             NUMBER := 0;
    l_line VARCHAR2(4000);


    FUNCTION get_length (l_column_def IN sys.DBMS_SQL.desc_rec)
      RETURN NUMBER IS
      l_width   NUMBER;
    BEGIN
      l_width   := l_column_def.col_max_len;
      l_width   :=
        CASE l_column_def.col_type
          WHEN 12 THEN /* DATE */
                      20
          WHEN 2 THEN /* NUMBER */
                     10
          ELSE l_width
        END;
      -- Don't display more than 256 characters of any one column
      l_width   := LEAST(256,GREATEST (l_width, l_column_def.col_name_len));

      RETURN l_width;
    END get_length;
  BEGIN
    EXECUTE IMMEDIATE 'alter session set nls_date_format=''DD-MON-YYYY HH24:MI:SS''';

    l_cursor := sys.DBMS_SQL.TO_CURSOR_NUMBER(p_rc);

    -- Describe columns
    sys.DBMS_SQL.describe_columns (c => l_cursor, col_cnt => l_column_count, desc_t => l_column_descriptions);

    l_line := '';
    FOR i IN 1 .. l_column_count LOOP
      l_column_width   := get_length (l_column_descriptions (i));

      l_line := l_line || RPAD (l_column_descriptions (i).col_name, l_column_width);
      l_line := l_line || ' ';
      DBMS_SQL.define_column (l_cursor, i, l_column_value, 4000);
    END LOOP;

    DBMS_OUTPUT.PUT_LINE(l_line);

    l_line := '';
    FOR i IN 1 .. l_column_count LOOP
      l_column_width   := get_length (l_column_descriptions (i));

      l_line := l_line || RPAD ('-', l_column_width, '-');
      l_line := l_line || ' ';
      DBMS_SQL.define_column (l_cursor, i, l_column_value, 4000);
    END LOOP;

    DBMS_OUTPUT.PUT_LINE(l_line);

--   l_status   := sys.DBMS_SQL.execute (l_cursor);

    WHILE (sys.DBMS_SQL.fetch_rows (l_cursor) > 0) LOOP
      l_rec_count   := l_rec_count + 1;

    l_line := '';
      FOR i IN 1 .. l_column_count LOOP
        DBMS_SQL.COLUMN_VALUE (l_cursor, i, l_column_value);
        l_column_value := translate(l_column_value,chr(10), chr(200));
        l_column_width   := get_length (l_column_descriptions (i));

        IF l_column_value IS NULL THEN
          l_line := l_line || RPAD (' ', l_column_width);
        ELSE
          l_line := l_line || RPAD (l_column_value, l_column_width);
        END IF;

        l_line := l_line || ' ';
      END LOOP;

      DBMS_OUTPUT.PUT_LINE(l_line);
    END LOOP;

    IF l_rec_count = 0 THEN
      DBMS_OUTPUT.PUT_LINE ('No data found.');
    ELSE
      DBMS_OUTPUT.PUT_LINE (l_rec_count || ' rows returned.');
    END IF;

    sys.DBMS_SQL.close_cursor (l_cursor);

    EXECUTE IMMEDIATE 'alter session set nls_date_format=''DD-MON-YYYY''';
  EXCEPTION
    WHEN OTHERS THEN
      EXECUTE IMMEDIATE 'alter session set nls_date_format=''DD-MON-YYYY''';

      RAISE;
  END dump_cursor;

-- This shows how to use it...
BEGIN

  OPEN l_rc FOR SELECT object_id, object_name, object_type, last_ddl_time FROM dba_objects WHERE rownum <= 100;
  dump_cursor(l_rc);
END;

标签:mysql,oracle,format,formatting
来源: https://codeday.me/bug/20190929/1832395.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有