一直以来,觉得MySQL中使用\G参数改变输出结果集的显示方式非常好用,尤其是在命令行界面。但是ORACLE数据库没有这个功能,今天在搜索到Tom大师的一篇博文时,发现大师用一个存储过程print_table实现了类似这样的功能。只是我们这些凡夫俗子不知道而已,特意整理在此,方便自己或有需要的人以后查看。

CREATE OR REPLACE PROCEDURE print_table(p_query IN VARCHAR2) 

AUTHID  CURRENT_USER 

IS 

  l_thecursor   INTEGER DEFAULT dbms_sql.open_cursor; 

  l_columnvalue VARCHAR2(4000); 

  l_status      INTEGER; 

  l_desctbl     dbms_sql.desc_tab; 

  l_colcnt      NUMBER; 

BEGIN 

    EXECUTE IMMEDIATE 'alter session set  nls_date_format=''dd-mon-yyyy hh24:mi:ss'' '; 

 

    dbms_sql.parse(l_thecursor, p_query, dbms_sql.native); 

 

    dbms_sql.describe_columns (l_thecursor, l_colcnt, l_desctbl); 

 

    FOR i IN 1 .. l_colcnt LOOP 

        dbms_sql.define_column (l_thecursor, i, l_columnvalue, 4000); 

    END LOOP; 

 

    l_status := dbms_sql.EXECUTE(l_thecursor); 

 

    WHILE ( dbms_sql.Fetch_rows(l_thecursor) > 0 ) LOOP 

        FOR i IN 1 .. l_colcnt LOOP 

            dbms_sql.column_value (l_thecursor, i, l_columnvalue); 

 

            dbms_output.Put_line (RPAD(L_desctbl(i).col_name, 30) 

                                  || ': ' 

                                  || l_columnvalue); 

        END LOOP; 

 

        dbms_output.put_line('-----------------'); 

    END LOOP; 

 

    EXECUTE IMMEDIATE 'alter session set nls_date_format=''dd-MON-rr'' '; 

EXCEPTION 

  WHEN OTHERS THEN 

             EXECUTE IMMEDIATE 

             'alter session set nls_date_format=''dd-MON-rr'' '; 

 

             RAISE; 

END; 

/ 

如下测试所示:

SQL> set serveroutput on size 99999;

SQL> execute print_table('select * from v$session where sid=997');

SADDR                         : 000000085FA35CA0

SID                           : 997

SERIAL#                       : 1

AUDSID                        : 0

PADDR                         : 000000085F6B7E70

USER#                         : 0

USERNAME                      :

COMMAND                       : 0

OWNERID                       : 2147483644

TADDR                         :

LOCKWAIT                      :

STATUS                        : ACTIVE

SERVER                        : DEDICATED

SCHEMA#                       : 0

SCHEMANAME                    : SYS

OSUSER                        : oracle

PROCESS                       : 5036

MACHINE                       : xxxx

PORT                          : 0

TERMINAL                      : UNKNOWN

PROGRAM                       : oracle@xxxxx (DBW0)

TYPE                          : BACKGROUND

SQL_ADDRESS                   : 00

SQL_HASH_VALUE                : 0

SQL_ID                        :

SQL_CHILD_NUMBER              : 0

PREV_SQL_ADDR                 : 00

PREV_HASH_VALUE               : 0

PREV_SQL_ID                   :

PREV_CHILD_NUMBER             : 0

PLSQL_ENTRY_OBJECT_ID         :

PLSQL_ENTRY_SUBPROGRAM_ID     :

PLSQL_OBJECT_ID               :

PLSQL_SUBPROGRAM_ID           :

MODULE                        :

MODULE_HASH                   : 0

ACTION                        :

ACTION_HASH                   : 0

CLIENT_INFO                   :

FIXED_TABLE_SEQUENCE          : 0

ROW_WAIT_OBJ#                 : -1

ROW_WAIT_FILE#                : 0

ROW_WAIT_BLOCK#               : 0

ROW_WAIT_ROW#                 : 0

LOGON_TIME                    : 04-jul-2018 21:15:52

LAST_CALL_ET                  : 5272838

PDML_ENABLED                  : NO

FAILOVER_TYPE                 : NONE

FAILOVER_METHOD               : NONE

FAILED_OVER                   : NO

RESOURCE_CONSUMER_GROUP       :

PDML_STATUS                   : DISABLED

PDDL_STATUS                   : DISABLED

PQ_STATUS                     : DISABLED

CURRENT_QUEUE_DURATION        : 0

CLIENT_IDENTIFIER             :

BLOCKING_SESSION_STATUS       : NO HOLDER

BLOCKING_INSTANCE             :

BLOCKING_SESSION              :

SEQ#                          : 34697

EVENT#                        : 3

EVENT                         : rdbms ipc message

P1TEXT                        : timeout

P1                            : 300

P1RAW                         : 000000000000012C

P2TEXT                        :

P2                            : 0

P2RAW                         : 00

P3TEXT                        :

P3                            : 0

P3RAW                         : 00

WAIT_CLASS_ID                 : 2723168908

WAIT_CLASS#                   : 6

WAIT_CLASS                    : Idle

WAIT_TIME                     : 0

SECONDS_IN_WAIT               : 107

STATE                         : WAITING

SERVICE_NAME                  : SYS$BACKGROUND

SQL_TRACE                     : DISABLED

SQL_TRACE_WAITS               : FALSE

SQL_TRACE_BINDS               : FALSE

ECID                          :

-----------------

PL/SQL procedure successfully completed.

 

SQL> 

参考资料:

https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:1035431863958,%7Bprint_table%7D

oracle中print_table存储过程介绍的更多相关文章

  1. oracle中print_table存储过程实例介绍

    oracle中pro_print_table存储过程实例介绍 存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.这 ...

  2. Oracle中执行存储过程call和exec区别

    Oracle中执行存储过程call和exec区别 在sqlplus中这两种方法都可以使用: exec pro_name(参数1..); call pro_name(参数1..); 区别: 1. 但是e ...

  3. oracle 中的存储过程

      oracle 中的存储过程 --oracle 中的存储过程, --不带任何参数的 CREATE OR REPLACE PROCEDURE PRO_TEST AS -- AS 和is 没有任何区别 ...

  4. ORACLE 中的 锁 介绍

    ORACLE 中的 锁 介绍 Oracle数据库支持多个用户同时与数据库进行交互,每个用户都可以同时运行自己的事务,从而也需要对并发访问进行控制.Oracle也是用“锁”的机制来防止各个事务之间的相互 ...

  5. 用sql语句导出oracle中的存储过程和函数

    用sql语句导出oracle中的存储过程和函数: SET echo off ; SET heading off ; SET feedback off ; SPOOL 'C:/PRC.SQL' repl ...

  6. oracle中的存储过程例子

    用了两年Oracle还没写过存储过程,真是十分惭愧,从今天开始学习Oracle存储过程,完全零起点,争取每日一篇学习笔记,可能开始认识的不全面甚至有错误,但坚持下来一定会有收获. . 建立一个存储过程 ...

  7. Mybatis调用Oracle中的存储过程和function

    一.Mybatis调用存储过程 1 在数据库中创建以下的存储过程create or replace procedure pro_hello(p_user_name in varchar2,p_resu ...

  8. Oracle中的存储过程简单例子

    --创建表create table TESTTABLE(  id1  VARCHAR2(12),  name VARCHAR2(32))select t.id1,t.name from TESTTAB ...

  9. oracle中的存储过程(实例一)

    引子 这是测试环境存在了很久的问题.由于基础配置信息(如:代理人信息)不像生产环境有专人维护,常常会有数据过期,导致无法使用的情况. 而很多配置数据是在外围系统维护(如代理人信息,在销管系统)以往的解 ...

随机推荐

  1. ELK实践(一):基础入门

    虽然用了ELK很久了,但一直苦于没有自己尝试搭建过,所以想抽时间尝试尝试.原本打算按照教程 <ELK集中式日志平台之二 - 部署>(作者:樊浩柏科学院) 进行测试的,没想到一路出了很多坑, ...

  2. NewLife.Redis基础教程

    X组件缓存架构以ICache接口为核心,包括MemoryCache.Redis和DbCache实现,支持FX和netstandard2.0!后续例程与使用说明均以Redis为例,各缓存实现类似. Re ...

  3. 13 Tensorflow机制(翻译)

    代码: tensorflow/examples/tutorials/mnist/ 本文的目的是来展示如何使用Tensorflow训练和评估手写数字识别问题.本文的观众是那些对使用Tensorflow进 ...

  4. 90 行 Python 搭一个音乐搜索工具

    之前一段时间读到了这篇博客,其中描述了作者如何用java实现国外著名音乐搜索工具shazam的基本功能.其中所提到的文章又将我引向了关于shazam的一篇论文及另外一篇博客.读完之后发现其中的原理并不 ...

  5. Go语言学习笔记(三) [控制结构、内建函数]

    日期:2014年7月21日   一.控制结构   1.Go中,只有几个控制结构,它没有do或者while循环,有for,灵活的switch语句和if,在switch中可以接受像for那样可选的初始化语 ...

  6. 【Go】获取用户真实的ip地址

    原文链接:https://blog.thinkeridea.com/201903/go/get_client_ip.html 用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip ...

  7. 翻译:INSERT(已提交到MariaDB官方手册)

    本文为mariadb官方手册:INSERT的译文. 原文:https://mariadb.com/kb/en/insert/我提交到MariaDB官方手册的译文:https://mariadb.com ...

  8. backbond Model方法(set)

    backbond的Model,其中存在一些操作属性的方法,而在这些方法中,最重要的就是set方法,其余的方法大部分都基于这个方法实现的,在backbond开发版中,也说了该方法是model中的核心方法 ...

  9. zepto中的属性设置

    上次看zepto的init方法时,有一段属性设置的代码,先来看看其表现: if (isPlainObject(properties)) { nodes = $(dom) $.each(properti ...

  10. zepto的ready方法

    zepto中的ready函数是作为$.fn的一个方法,即作为一个zepto对象的方法 readyRE = /complete|loaded|interactive/; ready: function( ...