好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

oracle中print_table存储过程实例介绍

定义

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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 ;

/

如下测试所示:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

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存储过程介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://www.cnblogs.com/kerrycode/archive/2018/09/03/9581464.html

查看更多关于oracle中print_table存储过程实例介绍的详细内容...

  阅读:29次