定義
成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的愛民網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
所謂存儲(chǔ)過程(Stored Procedure),就是一組用于完成特定數(shù)據(jù)庫功能的SQL語句集,該SQL語句集經(jīng)過
編譯后存儲(chǔ)在數(shù)據(jù)庫系統(tǒng)中。在使用時(shí)候,用戶通過指定已經(jīng)定義的存儲(chǔ)過程名字并給出相應(yīng)的存儲(chǔ)過程參數(shù)
來調(diào)用并執(zhí)行它,從而完成一個(gè)或一系列的數(shù)據(jù)庫操作。
一直以來,覺得MySQL中使用\G參數(shù)改變輸出結(jié)果集的顯示方式非常好用,尤其是在命令行界面。但是ORACLE數(shù)據(jù)庫沒有這個(gè)功能,今天在搜索到Tom大師的一篇博文時(shí),發(fā)現(xiàn)大師用一個(gè)存儲(chǔ)過程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 hh34: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存儲(chǔ)過程介紹,希望對(duì)大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!