1. 程式人生 > >oracle中print_table存儲過程實例介紹

oracle中print_table存儲過程實例介紹

sel cut mysql nds 定義 自己 center false create

oracle中pro_print_table存儲過程實例介紹

存儲過程(Stored Procedure),就是一組用於完成特定數據庫功能的SQL語句集,該SQL語句集經過編譯後存儲在數據庫系統中。這篇文章主要介紹了oracle中print_table存儲過程介紹,需要的朋友可以參考下

定義

所謂存儲過程(Stored Procedure),就是一組用於完成特定數據庫功能的SQL語句集,該SQL語句集經過
編譯後存儲在數據庫系統中。在使用時候,用戶通過指定已經定義的存儲過程名字並給出相應的存儲過程參數
來調用並執行它,從而完成一個或一系列的數據庫操作。

一直以來,覺得MySQL中使用\G參數改變輸出結果集的顯示方式非常好用,尤其是在命令行界面。但是ORACLE數據庫沒有這個功能,今天在搜索到Tom大師的一篇博文時,發現大師用一個存儲過程print_table實現了類似這樣的功能。只是我們這些凡夫俗子不知道而已,特意整理在此,方便自己或有需要的人以後查看。

create or replace
PROCEDURE pro_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 pro_print_table(‘select * from v$session where sid=540‘);
SADDR : 00000002FB63D5D0
SID : 540
SERIAL# : 57010
AUDSID : 26611743
PADDR : 00000002FE44E050
USER# : 186
USERNAME : TEAMB0
COMMAND : 3
OWNERID : 2147483644
TADDR :
LOCKWAIT :
STATUS : ACTIVE
SERVER : DEDICATED
SCHEMA# : 186
SCHEMANAME : TEAMB0
OSUSER : ASC099512
PROCESS : 14596:10816
MACHINE : YYII_ASC\PH4-3000006098
PORT : 56979
TERMINAL : PH4-3000006098
PROGRAM : sqlplus.exe
TYPE : USER
SQL_ADDRESS : 00000002FD46DD90
SQL_HASH_VALUE : 3200604717
SQL_ID : 5k79fgyzcaqjd
SQL_CHILD_NUMBER : 1
PREV_SQL_ADDR : 00000001E9827E70
PREV_HASH_VALUE : 763684067
PREV_SQL_ID : 9jvrjm0qs9t73
PREV_CHILD_NUMBER : 0
PLSQL_ENTRY_OBJECT_ID : 485728
PLSQL_ENTRY_SUBPROGRAM_ID : 1
PLSQL_OBJECT_ID :
PLSQL_SUBPROGRAM_ID :
MODULE : SQL*Plus
MODULE_HASH : 3669949024
ACTION :
ACTION_HASH : 0
CLIENT_INFO : 172.17.45.44
FIXED_TABLE_SEQUENCE : 1581100286
ROW_WAIT_OBJ# : 355
ROW_WAIT_FILE# : 1
ROW_WAIT_BLOCK# : 2786
ROW_WAIT_ROW# : 0
LOGON_TIME : 11-10月-2018 16:42:01
LAST_CALL_ET : 0
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# : 85
EVENT# : 263
EVENT : SQL*Net message from client
P1TEXT : driver id
P1 : 1413697536
P1RAW : 0000000054435000
P2TEXT : #bytes
P2 : 1
P2RAW : 0000000000000001
P3TEXT :
P3 : 0
P3RAW : 00
WAIT_CLASS_ID : 2723168908
WAIT_CLASS# : 6
WAIT_CLASS : Idle
WAIT_TIME : 6956
SECONDS_IN_WAIT : 73
STATE : WAITED KNOWN TIME
SERVICE_NAME : SYS$USERS
SQL_TRACE : DISABLED
SQL_TRACE_WAITS : FALSE
SQL_TRACE_BINDS : FALSE
ECID :
-----------------

PL/SQL 過程已成功完成。

oracle中print_table存儲過程實例介紹