• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    oracle中print_table存储过程实例介绍

    定义

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

    您可能感兴趣的文章:
    • oracle 存储过程、函数和触发器用法实例详解
    • windows中oracle存储过程加密的实例代码
    • Oracle带输入输出参数存储过程(包括sql分页功能)
    • Mybatis调用Oracle存储过程的方法图文详解
    • 详解Oracle调试存储过程
    • Oracle存储过程和存储函数创建方法(详解)
    • Oracle存储过程及调用
    • Oracle存储过程、包、方法使用总结(推荐)
    • Oracle生成单据编号存储过程的实例代码
    • Oracle数据库创建存储过程的示例详解
    上一篇:Oracle数据加载和卸载的实现方法
    下一篇:oracle net manager 数据传输安全步骤详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    oracle中print_table存储过程实例介绍 oracle,中,print,table,存储,