imp_res_field.phpt 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. --TEST--
  2. Oracle Database 12c Implicit Result Sets: field tests
  3. --EXTENSIONS--
  4. oci8
  5. --SKIPIF--
  6. <?php
  7. $target_dbs = array('oracledb' => true, 'timesten' => false); // test runs on these DBs
  8. require(__DIR__.'/skipif.inc');
  9. preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches);
  10. if (!(isset($matches[0]) && $matches[1] >= 12)) {
  11. die("skip expected output only valid when using Oracle Database 12c or greater");
  12. }
  13. preg_match('/^[[:digit:]]+/', oci_client_version(), $matches);
  14. if (!(isset($matches[0]) && $matches[0] >= 12)) {
  15. die("skip works only with Oracle 12c or greater version of Oracle client libraries");
  16. }
  17. ?>
  18. --FILE--
  19. <?php
  20. require(__DIR__.'/connect.inc');
  21. // Initialization
  22. $stmtarray = array(
  23. "drop table imp_res_field_tab_1",
  24. "create table imp_res_field_tab_1 (c1_number number, c2_varchar210 varchar2(10))",
  25. "insert into imp_res_field_tab_1 values (1111, 'abcde')",
  26. "drop table imp_res_field_tab_2",
  27. "create table imp_res_field_tab_2 (c3_varchar21 varchar2(4))",
  28. "insert into imp_res_field_tab_2 values ('tttt')",
  29. "drop table imp_res_field_tab_3",
  30. "create table imp_res_field_tab_3 (c4_number52 number(5,2))",
  31. "insert into imp_res_field_tab_3 values (33)",
  32. "insert into imp_res_field_tab_3 values (NULL)",
  33. "create or replace procedure imp_res_field_proc as
  34. c1 sys_refcursor;
  35. begin
  36. open c1 for select * from imp_res_field_tab_1 order by 1;
  37. dbms_sql.return_result(c1);
  38. open c1 for select * from imp_res_field_tab_2 order by 1;
  39. dbms_sql.return_result(c1);
  40. open c1 for select * from imp_res_field_tab_3 order by 1;
  41. dbms_sql.return_result(c1);
  42. end;"
  43. );
  44. oci8_test_sql_execute($c, $stmtarray);
  45. function print_fields($s)
  46. {
  47. echo "num fields : " . oci_num_fields($s) . "\n";
  48. for ($i = 1; $i <= oci_num_fields($s); $i++) {
  49. $is_null = oci_field_is_null($s, $i) ? "T" : "F";
  50. $name = oci_field_name($s, $i);
  51. $precision = oci_field_precision($s, $i);
  52. $scale = oci_field_scale($s, $i);
  53. $size = oci_field_size($s, $i);
  54. $typeraw = oci_field_type_raw($s, $i);
  55. $type = oci_field_type($s, $i);
  56. echo "$name\t: is_null $is_null, precision $precision, scale $scale, size $size, typeraw $typeraw, type $type\n";
  57. }
  58. }
  59. // Run Test
  60. echo "Test 1 - can't get IRS fields from parent\n";
  61. $s = oci_parse($c, "begin imp_res_field_proc(); end;");
  62. oci_execute($s);
  63. print_fields($s);
  64. echo "\nTest 2 - can't get IRS fields from parent when fetching\n";
  65. $s = oci_parse($c, "begin imp_res_field_proc(); end;");
  66. oci_execute($s);
  67. while (($r = oci_fetch_row($s))) {
  68. var_dump($r);
  69. print_fields($s);
  70. }
  71. echo "\nTest 3 - get IRS fields\n";
  72. $s = oci_parse($c, "begin imp_res_field_proc(); end;");
  73. oci_execute($s);
  74. while (($s1 = oci_get_implicit_resultset($s))) {
  75. print_fields($s1);
  76. }
  77. echo "\nTest 4 - get IRS fields before fetching rows\n";
  78. $s = oci_parse($c, "begin imp_res_field_proc(); end;");
  79. oci_execute($s);
  80. $i = 0;
  81. while (($s1 = oci_get_implicit_resultset($s))) {
  82. echo "===> Result set ".++$i."\n";
  83. print_fields($s1);
  84. while (($r = oci_fetch_row($s1)) !== false) {
  85. var_dump($r);
  86. }
  87. }
  88. echo "\nTest 5 - get IRS fields when fetching rows\n";
  89. $s = oci_parse($c, "begin imp_res_field_proc(); end;");
  90. oci_execute($s);
  91. $i = 0;
  92. while (($s1 = oci_get_implicit_resultset($s))) {
  93. echo "===> Result set ".++$i."\n";
  94. while (($r = oci_fetch_row($s1)) !== false) {
  95. var_dump($r);
  96. print_fields($s1);
  97. }
  98. }
  99. // Clean up
  100. $stmtarray = array(
  101. "drop procedure imp_res_field_proc",
  102. "drop table imp_res_field_tab_1",
  103. "drop table imp_res_field_tab_2",
  104. "drop table imp_res_field_tab_3"
  105. );
  106. oci8_test_sql_execute($c, $stmtarray);
  107. ?>
  108. --EXPECT--
  109. Test 1 - can't get IRS fields from parent
  110. num fields : 0
  111. Test 2 - can't get IRS fields from parent when fetching
  112. array(2) {
  113. [0]=>
  114. string(4) "1111"
  115. [1]=>
  116. string(5) "abcde"
  117. }
  118. num fields : 0
  119. array(1) {
  120. [0]=>
  121. string(4) "tttt"
  122. }
  123. num fields : 0
  124. array(1) {
  125. [0]=>
  126. string(2) "33"
  127. }
  128. num fields : 0
  129. array(1) {
  130. [0]=>
  131. NULL
  132. }
  133. num fields : 0
  134. Test 3 - get IRS fields
  135. num fields : 2
  136. C1_NUMBER : is_null F, precision 0, scale -127, size 22, typeraw 2, type NUMBER
  137. C2_VARCHAR210 : is_null F, precision 0, scale 0, size 10, typeraw 1, type VARCHAR2
  138. num fields : 1
  139. C3_VARCHAR21 : is_null F, precision 0, scale 0, size 4, typeraw 1, type VARCHAR2
  140. num fields : 1
  141. C4_NUMBER52 : is_null F, precision 5, scale 2, size 22, typeraw 2, type NUMBER
  142. Test 4 - get IRS fields before fetching rows
  143. ===> Result set 1
  144. num fields : 2
  145. C1_NUMBER : is_null F, precision 0, scale -127, size 22, typeraw 2, type NUMBER
  146. C2_VARCHAR210 : is_null F, precision 0, scale 0, size 10, typeraw 1, type VARCHAR2
  147. array(2) {
  148. [0]=>
  149. string(4) "1111"
  150. [1]=>
  151. string(5) "abcde"
  152. }
  153. ===> Result set 2
  154. num fields : 1
  155. C3_VARCHAR21 : is_null F, precision 0, scale 0, size 4, typeraw 1, type VARCHAR2
  156. array(1) {
  157. [0]=>
  158. string(4) "tttt"
  159. }
  160. ===> Result set 3
  161. num fields : 1
  162. C4_NUMBER52 : is_null F, precision 5, scale 2, size 22, typeraw 2, type NUMBER
  163. array(1) {
  164. [0]=>
  165. string(2) "33"
  166. }
  167. array(1) {
  168. [0]=>
  169. NULL
  170. }
  171. Test 5 - get IRS fields when fetching rows
  172. ===> Result set 1
  173. array(2) {
  174. [0]=>
  175. string(4) "1111"
  176. [1]=>
  177. string(5) "abcde"
  178. }
  179. num fields : 2
  180. C1_NUMBER : is_null F, precision 0, scale -127, size 22, typeraw 2, type NUMBER
  181. C2_VARCHAR210 : is_null F, precision 0, scale 0, size 10, typeraw 1, type VARCHAR2
  182. ===> Result set 2
  183. array(1) {
  184. [0]=>
  185. string(4) "tttt"
  186. }
  187. num fields : 1
  188. C3_VARCHAR21 : is_null F, precision 0, scale 0, size 4, typeraw 1, type VARCHAR2
  189. ===> Result set 3
  190. array(1) {
  191. [0]=>
  192. string(2) "33"
  193. }
  194. num fields : 1
  195. C4_NUMBER52 : is_null F, precision 5, scale 2, size 22, typeraw 2, type NUMBER
  196. array(1) {
  197. [0]=>
  198. NULL
  199. }
  200. num fields : 1
  201. C4_NUMBER52 : is_null T, precision 5, scale 2, size 22, typeraw 2, type NUMBER