阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle中print_table存储过程介绍

122次阅读
没有评论

共计 3454 个字符,预计需要花费 9 分钟才能阅读完成。

一直以来,觉得 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>

更多 Oracle 相关信息见 Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计3454字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中