oracle中print_table存储过程实例介绍
定义
所谓存储过程(StoredProcedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。
一直以来,觉得MySQL中使用\G参数改变输出结果集的显示方式非常好用,尤其是在命令行界面。但是ORACLE数据库没有这个功能,今天在搜索到Tom大师的一篇博文时,发现大师用一个存储过程print_table实现了类似这样的功能。只是我们这些凡夫俗子不知道而已,特意整理在此,方便自己或有需要的人以后查看。
CREATEORREPLACEPROCEDUREprint_table(p_queryINVARCHAR2)
AUTHIDCURRENT_USER
IS
l_thecursorINTEGERDEFAULTdbms_sql.open_cursor;
l_columnvalueVARCHAR2(4000);
l_statusINTEGER;
l_desctbldbms_sql.desc_tab;
l_colcntNUMBER;
BEGIN
EXECUTEIMMEDIATE'altersessionsetnls_date_format=''dd-mon-yyyyhh24:mi:ss''';
dbms_sql.parse(l_thecursor,p_query,dbms_sql.native);
dbms_sql.describe_columns(l_thecursor,l_colcnt,l_desctbl);
FORiIN1..l_colcntLOOP
dbms_sql.define_column(l_thecursor,i,l_columnvalue,4000);
ENDLOOP;
l_status:=dbms_sql.EXECUTE(l_thecursor);
WHILE(dbms_sql.Fetch_rows(l_thecursor)>0)LOOP
FORiIN1..l_colcntLOOP
dbms_sql.column_value(l_thecursor,i,l_columnvalue);
dbms_output.Put_line(RPAD(L_desctbl(i).col_name,30)
||':'
||l_columnvalue);
ENDLOOP;
dbms_output.put_line('-----------------');
ENDLOOP;
EXECUTEIMMEDIATE'altersessionsetnls_date_format=''dd-MON-rr''';
EXCEPTION
WHENOTHERSTHEN
EXECUTEIMMEDIATE
'altersessionsetnls_date_format=''dd-MON-rr''';
RAISE;
END;
/
如下测试所示:
SQL>setserveroutputonsize99999;
SQL>executeprint_table('select*fromv$sessionwheresid=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-201821: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:NOHOLDER
BLOCKING_INSTANCE:
BLOCKING_SESSION:
SEQ#:34697
EVENT#:3
EVENT:rdbmsipcmessage
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/SQLproceduresuccessfullycompleted.
SQL>
参考资料:
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:1035431863958,%7Bprint_table%7D
总结
以上所述是小编给大家介绍的oracle中print_table存储过程介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!