oracle中table函数的使用

  • Post author:
  • Post category:其他



个人理解,table函数是把数组类型的变量展开显示出来


三种用法:


1 table()与返回值为数组的类型的普通函数一起使用


2 table()与返回值为数组类型的管道函数一起使用


3, table()与系统包中的管道函数一起使用 实际也就是2



以下代码为例子:



  1. –创建类型t_test

  2. SQL> create or replace type t_test



    as






    object



    (

  3. 2  id number,

  4. 3  time date,

  5. 4  data varchar2(60)

  6. 5  );

  7. 6  /


  8. Type created


  9. Executed



    in



    0.063 seconds

  10. –创建以t_test类型的数组t_test_tb

  11. SQL> create or replace type t_test_tb



    as



    table of t_test;

  12. 2  /


  13. Type created


  14. Executed



    in



    0.031 seconds


  15. –1 创建普通函数 返回数组类型,用数组的实例存放结果集(t_array),结果集全部处理完成后一起返回

  16. SQL> create or replace function f_test_array(n



    in



    number



    default






    null



    )



    return



    t_test_tb



    as




  17. 2    t_array t_test_tb := t_test_tb();

  18. 3  begin

  19. 4



    for



    i



    in



    1..nvl(n,100) loop

  20. 5        t_array.extend();

  21. 6        t_array(t_array.count) := t_test(i,sysdate,


    ‘mi’


    ||i);

  22. 7    end loop;

  23. 8



    return



    t_array;

  24. 9  end;

  25. 10  /


  26. Function created


  27. Executed



    in



    0.046 seconds

  28. –直接select是不能显示的

  29. SQL> select f_test_array(10) from dual;


  30. F_TEST_ARRAY(10)

  31. —————-

  32. <Object>


  33. Executed



    in



    0.062 seconds

  34. –对于返回类型是数组的那么用table()函数或者the

  35. SQL> select * from table(f_test_array(10));


  36. ID TIME        DATA

  37. ———- ———– ————————————————————

  38. 1 2010-8-10 1 mi1

  39. 2 2010-8-10 1 mi2

  40. 3 2010-8-10 1 mi3

  41. 4 2010-8-10 1 mi4

  42. 5 2010-8-10 1 mi5

  43. 6 2010-8-10 1 mi6

  44. 7 2010-8-10 1 mi7

  45. 8 2010-8-10 1 mi8

  46. 9 2010-8-10 1 mi9

  47. 10 2010-8-10 1 mi10


  48. 10 rows selected


  49. Executed



    in



    0.187 seconds


  50. SQL> select * from the(select f_test_array(10) from dual);


  51. ID TIME        DATA

  52. ———- ———– ————————————————————

  53. 1 2010-8-10 1 mi1

  54. 2 2010-8-10 1 mi2

  55. 3 2010-8-10 1 mi3

  56. 4 2010-8-10 1 mi4

  57. 5 2010-8-10 1 mi5

  58. 6 2010-8-10 1 mi6

  59. 7 2010-8-10 1 mi7

  60. 8 2010-8-10 1 mi8

  61. 9 2010-8-10 1 mi9

  62. 10 2010-8-10 1 mi10


  63. 10 rows selected


  64. Executed



    in



    0.172 seconds

  65. –2 用返回类型为数组的管道函数,这里没用用到存放中间结果的变量,每处理完一条记录那么立刻返回结果

  66. SQL> create or replace function f_test_pipe(n



    in



    number



    default






    null



    )



    return



    t_test_tb pipelined

  67. 2



    as




  68. 3  begin

  69. 4



    for



    i



    in



    1..nvl(n,100) loop

  70. 5             pipe row(t_test(i,sysdate,


    ‘mi’


    ||i));

  71. 6         end loop;

  72. 7



    return



    ;

  73. 8  end;

  74. 9  /


  75. Function created


  76. Executed



    in



    0.031 seconds


  77. SQL> select f_test_pipe(10) from dual;


  78. F_TEST_PIPE(10)

  79. —————

  80. <Object>


  81. Executed



    in



    0.062 seconds


  82. SQL> select * from table(f_test_pipe(10));


  83. ID TIME        DATA

  84. ———- ———– ————————————————————

  85. 1 2010-8-10 1 mi1

  86. 2 2010-8-10 1 mi2

  87. 3 2010-8-10 1 mi3

  88. 4 2010-8-10 1 mi4

  89. 5 2010-8-10 1 mi5

  90. 6 2010-8-10 1 mi6

  91. 7 2010-8-10 1 mi7

  92. 8 2010-8-10 1 mi8

  93. 9 2010-8-10 1 mi9

  94. 10 2010-8-10 1 mi10


  95. 10 rows selected


  96. Executed



    in



    0.156 seconds


  97. SQL> select * from the(select f_test_pipe(10) from dual);


  98. ID TIME        DATA

  99. ———- ———– ————————————————————

  100. 1 2010-8-10 1 mi1

  101. 2 2010-8-10 1 mi2

  102. 3 2010-8-10 1 mi3

  103. 4 2010-8-10 1 mi4

  104. 5 2010-8-10 1 mi5

  105. 6 2010-8-10 1 mi6

  106. 7 2010-8-10 1 mi7

  107. 8 2010-8-10 1 mi8

  108. 9 2010-8-10 1 mi9

  109. 10 2010-8-10 1 mi10


  110. 10 rows selected


  111. Executed



    in



    0.172 seconds


  112. SQL> drop table test;


  113. Table dropped


  114. Executed



    in



    0.047 seconds

  115. –3 table调用包中返回为数组类型的函数 dbms_xplan.display 是返回类型为数组的管道函数

  116. SQL> create table test(id number, name varchar2(30));


  117. Table created


  118. Executed



    in



    0.047 seconds


  119. SQL> insert into test values(1,


    ‘d’


    );


  120. 1 row inserted


  121. Executed



    in



    0 seconds


  122. SQL> commit;


  123. Commit complete


  124. Executed



    in



    0.016 seconds


  125. SQL> explain plan



    for



    select * from test;


  126. Explained


  127. Executed



    in



    0 seconds


  128. SQL> select * from table(dbms_xplan.display);


  129. PLAN_TABLE_OUTPUT

  130. ——————————————————————————–

  131. Plan hash value: 1357081020

  132. ————————————————————————–

  133. | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

  134. ————————————————————————–

  135. |   0 | SELECT STATEMENT  |      |     1 |    30 |     3   (0)| 00:00:01 |

  136. |   1 |  TABLE ACCESS FULL| TEST |     1 |    30 |     3   (0)| 00:00:01 |

  137. ————————————————————————–

  138. Note

  139. —–

  140. – dynamic sampling used



    for






    this



    statement


  141. 12 rows selected


  142. Executed



    in



    0.187 seconds