【问题标题】:Format SQL Table data as Text Table将 SQL 表数据格式化为文本表
【发布时间】:2015-12-01 07:57:23
【问题描述】:

我有一个来自 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 的,您可以设置 COLUMN col_name FORMAT A24 其中 24 是列的宽度...如果不是 - 您可以使用 rpad() 函数来对齐文本
  • 查看你的SQL客户端的手册,也许可以做到
  • 您希望它如何格式化(用空格填充列;HTML/DOC/ODF/RTF/LaTeX 文档;其他)?什么是 BLOB 列,您希望它们如何格式化?您能否提供您的预期/理想输出的想法。
  • 我已经给出了一些格式化示例。见我的回答@Quann。你仍然可以接受我的回答:P

标签: mysql oracle formatting format


【解决方案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 结果 -> 粘贴表数据
  2. 文件 -> 导入 CSV 文件
  3. 或者您可以手动生成表格

您可以在此处将列值对齐到左、右、中心。

表格边框不使用 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  |

【讨论】:

    【解决方案2】:

    如果您使用的是 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 2022-01-15
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多