定義
所謂存儲過程(Stored Procedure),就是一組用于完成特定數(shù)據(jù)庫功能的SQL語句集,該SQL語句集經(jīng)過
編譯后存儲在數(shù)據(jù)庫系統(tǒng)中。在使用時候,用戶通過指定已經(jīng)定義的存儲過程名字并給出相應(yīng)的存儲過程參數(shù)
來調(diào)用并執(zhí)行它,從而完成一個或一系列的數(shù)據(jù)庫操作。
一直以來,覺得MySQL中使用\G參數(shù)改變輸出結(jié)果集的顯示方式非常好用,尤其是在命令行界面。但是ORACLE數(shù)據(jù)庫沒有這個功能,今天在搜索到Tom大師的一篇博文時,發(fā)現(xiàn)大師用一個存儲過程print_table實(shí)現(xiàn)了類似這樣的功能。只是我們這些凡夫俗子不知道而已,特意整理在此,方便自己或有需要的人以后查看。
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
總結(jié)
以上所述是小編給大家介紹的oracle中print_table存儲過程介紹,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
您可能感興趣的文章:- oracle 存儲過程、函數(shù)和觸發(fā)器用法實(shí)例詳解
- windows中oracle存儲過程加密的實(shí)例代碼
- Oracle帶輸入輸出參數(shù)存儲過程(包括sql分頁功能)
- Mybatis調(diào)用Oracle存儲過程的方法圖文詳解
- 詳解Oracle調(diào)試存儲過程
- Oracle存儲過程和存儲函數(shù)創(chuàng)建方法(詳解)
- Oracle存儲過程及調(diào)用
- Oracle存儲過程、包、方法使用總結(jié)(推薦)
- Oracle生成單據(jù)編號存儲過程的實(shí)例代碼
- Oracle數(shù)據(jù)庫創(chuàng)建存儲過程的示例詳解