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

时间:2015-12-01 07:57:24

标签: mysql oracle formatting format

我从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

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

2 个答案:

答案 0 :(得分:1)

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

如果您正在寻找纯数据库解决方案(无客户端),我会使用DBMS_SQL。这是基本代码(如下)。此版本只是将结果集写入DBMS_OUTPUT。您可以将其更改为您想要的任何内容。此外,您还需要对其进行扩展,以处理超出NUMBERDATEVARCHAR2的数据类型。

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;

答案 1 :(得分:1)

你的文字sql结果:

+---+------------------------------+-----------------------------+---+------+---+------+--------+---------------------------------------+-----------+---------------+
| 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 |
+---+------------------------------+-----------------------------+---+------+---+------+--------+---------------------------------------+-----------+---------------+

您可以按tablesgenerator生成文本表格,如下列格式。

您可以输入以下内容:

  1. 文件中的SQL结果 - &gt;粘贴表数据
  2. 文件 - &gt;导入CSV文件
  3. 或者您可以手动生成表格
  4. 您可以在此处将列值对齐到左侧,右侧,中间。

    不使用表格边框的Unicode符号

    +----+-------------+--------+-------+-----+
    | id | name        | gender | state | age |
    +----+-------------+--------+-------+-----+
    | 1  | John Kenedy | male   | NY    | 32  |
    +----+-------------+--------+-------+-----+
    | 2  | Meresa Oslo | female | HI    | 26  |
    +----+-------------+--------+-------+-----+
    | 3  | Mike Lanes  | male   | FL    | 25  |
    +----+-------------+--------+-------+-----+
    

    对表格边框使用Unicode符号

    ╔════╦═════════════╦════════╦═══════╦═════╗
    ║ id ║ name        ║ gender ║ state ║ age ║
    ╠════╬═════════════╬════════╬═══════╬═════╣
    ║ 1  ║ John Kenedy ║ male   ║ NY    ║ 32  ║
    ╠════╬═════════════╬════════╬═══════╬═════╣
    ║ 2  ║ Meresa Oslo ║ female ║ HI    ║ 26  ║
    ╠════╬═════════════╬════════╬═══════╬═════╣
    ║ 3  ║ Mike Lanes  ║ male   ║ FL    ║ 25  ║
    ╚════╩═════════════╩════════╩═══════╩═════╝
    

    降价表

    | id | name        | gender | state | age |
    |----|-------------|--------|-------|-----|
    | 1  | John Kenedy | male   | NY    | 32  |
    | 2  | Meresa Oslo | female | HI    | 26  |
    | 3  | Mike Lanes  | male   | FL    | 25  |
    
相关问题