zoukankan      html  css  js  c++  java
  • [SQL Utility]Tom’s PRINT_TABLE

    默认的Select 语句的显示结果是把表中的每一条记录显示成一行,如果表的列数很多会带来一个问题(求其是在SQL*PLUS中),那就是要么列名显示不全,或者会折成很多行来显示,造成阅读上的不便。 如果我们只是很关心这种多列表中的特定一行或几行数据,如果可以把显示结果“转置”过来,每一行显示一个列的数据,这样会大大有助于阅读,分析数据。

    多说无益,还是上例子说明。 如下,

     

    默认的显示

    SQL> select * from t where rownum = 1;

            N1         N2         N3         N4         N5
    ---------- ---------- ---------- ---------- ----------
            10         20         30        200         30

    ====》

    转换后的显示

    N1                            : 10
    N2                            : 20
    N3                            : 30
    N4                            : 200
    N5                            : 30
    -----------------

    Tom 很早就给出了这样一个解决方法,参见这里

    具体代码如下:

       1: create or replace procedure print_table( p_query in varchar2 )
       2: AUTHID CURRENT_USER
       3: is
       4:     l_theCursor     integer default dbms_sql.open_cursor;
       5:     l_columnValue   varchar2(4000);
       6:     l_status        integer;
       7:     l_descTbl       dbms_sql.desc_tab;
       8:     l_colCnt        number;
       9: begin
      10:     execute immediate
      11:     'alter session set 
      12:         nls_date_format=''dd-mon-yyyy hh24:mi:ss'' ';
      13:  
      14:     dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
      15:     dbms_sql.describe_columns
      16:     ( l_theCursor, l_colCnt, l_descTbl );
      17:  
      18:     for i in 1 .. l_colCnt loop
      19:         dbms_sql.define_column
      20:         (l_theCursor, i, l_columnValue, 4000);
      21:     end loop;
      22:  
      23:     l_status := dbms_sql.execute(l_theCursor);
      24:  
      25:     while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
      26:         for i in 1 .. l_colCnt loop
      27:             dbms_sql.column_value
      28:             ( l_theCursor, i, l_columnValue );
      29:             dbms_output.put_line
      30:             ( rpad( l_descTbl(i).col_name, 30 )
      31:               || ': ' || 
      32:               l_columnValue );
      33:         end loop;
      34:         dbms_output.put_line( '-----------------' );
      35:     end loop;
      36:     execute immediate
      37:         'alter session set nls_date_format=''dd-MON-rr'' ';
      38: exception
      39:     when others then
      40:       execute immediate
      41:           'alter session set nls_date_format=''dd-MON-rr'' ';
      42:       raise;
      43: end;
      44: /
      45:  

    用法很简单,

    SQL> set serveroutput on
    SQL> exec print_table('select * from t where rownum <= 2');
    N1                            : 10
    N2                            : 20
    N3                            : 30
    N4                            : 200
    N5                            : 30
    -----------------
    N1                            : 10
    N2                            : 1
    N3                            : 11
    N4                            : 10
    N5                            : 11
    -----------------

    PL/SQL procedure successfully completed.

    SQL>

  • 相关阅读:
    JZOJ1495 宝石
    JZOJ1496 页
    jzoj1497. 景点中心
    2019.8.2总结
    学习进度报告2021/3/19
    学习进度报告2021/3/18
    《学会提问》读书笔记2
    学习进度报告2021/3/17
    学习进度报告2021/3/16
    学习进度报告2021/3/15
  • 原文地址:https://www.cnblogs.com/fangwenyu/p/1635004.html
Copyright © 2011-2022 走看看