欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

oracle中print_table存储过程实例介绍

程序员文章站 2022-03-04 20:00:34
定义 所谓存储过程(stored procedure),就是一组用于完成特定数据库功能的sql语句集,该sql语句集经过 编译后存储在数据库系统中。在使用时候,用户...

定义

所谓存储过程(stored procedure),就是一组用于完成特定数据库功能的sql语句集,该sql语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。

一直以来,觉得mysql中使用\g参数改变输出结果集的显示方式非常好用,尤其是在命令行界面。但是oracle数据库没有这个功能,今天在搜索到tom大师的一篇博文时,发现大师用一个存储过程print_table实现了类似这样的功能。只是我们这些凡夫俗子不知道而已,特意整理在此,方便自己或有需要的人以后查看。 

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

总结

以上所述是小编给大家介绍的oracle中print_table存储过程介绍,希望对大家有所帮助