oracle中print_table存储过程实例介绍

所属分类: 数据库 / oracle 阅读数: 2350
收藏 0 赞 0 分享

定义

所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。

一直以来,觉得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存储过程介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

更多精彩内容其他人还在看

VS2015连接Oracle数据库的详细步骤

这篇文章主要介绍了VS2015连接Oracle数据库的详细步骤,需要的朋友可以参考下
收藏 0 赞 0 分享

常用的Oracle doc命令(收藏)

这篇文章主要介绍了常用的Oracle doc命令(收藏)的相关资料,非常不错,具有参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

ORACLE SQL语句优化技术要点解析

这篇文章主要介绍了ORACLE SQL语句优化技术的相关内容,小编觉得挺不错的,在这里分享给大家,需要的朋友可以参考下。
收藏 0 赞 0 分享

ORACLE多条件统计查询的简单方法

这篇文章主要介绍了ORACLE多条件统计查询的简单方法,具有一定参考价值。这里给大家分享下,希望对大家有所帮助。
收藏 0 赞 0 分享

ORACLE批量导入图片到BLOB字段代码示例

这篇文章主要介绍了ORACLE批量导入图片到BLOB字段代码示例,此代码示例是文章作者的项目源码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

PLSQL Developer登录的默认密码介绍

这篇文章主要介绍了PLSQL Developer登录的默认密码介绍,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Oracle数据行拆分多行方法示例

oracle数据库使用过程中,怎样将一行或者多行数据分割成需要的多行数据,本文我们就来看看具体方法,需要的朋友可以参考。
收藏 0 赞 0 分享

Oracle表空间不足的两种解决办法

这篇文章主要介绍了Oracle表空间不足的两种解决办法,需要的朋友可以参考下
收藏 0 赞 0 分享

巧妙解决Oracle NClob读写问题(经验分享)

下面小编就为大家带来一篇巧妙解决Oracle NClob读写问题(经验分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

oracle执行update语句时卡住问题分析及解决办法

这篇文章主要介绍了oracle执行update语句时卡住问题分析及解决办法,涉及记录锁等相关知识,具有一定参考价值,需要的朋友可以了解。
收藏 0 赞 0 分享
查看更多