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存储过程介绍,希望对大家有所帮助