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,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_ASCPH4-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 过程已成功完成。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|