1--TEST-- 2Prefetch with REF cursor. Test No 2 3--EXTENSIONS-- 4oci8 5--SKIPIF-- 6<?php require(__DIR__."/connect.inc"); 7preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); 8if (!(isset($matches[0]) && 9 ($matches[1] >= 10))) { 10 die("skip expected output only valid when using Oracle 10g or greater database server"); 11} 12preg_match('/^([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)/', oci_client_version(), $matches); 13if (!(isset($matches[0]) && 14 (($matches[1] == 11 && $matches[2] >= 2) || 15 ($matches[1] >= 12) 16 ))) { 17 die("skip test expected to work only with Oracle 11gR2 or greater version of client"); 18} 19?> 20--FILE-- 21<?php 22require __DIR__."/connect.inc"; 23 24// Creates the necessary package and tables. 25$stmtarray = array( 26 "DROP TABLE refcurtest", 27 "CREATE TABLE refcurtest (c1 NUMBER, c2 VARCHAR(20))", 28 "CREATE or REPLACE PACKAGE refcurpkg is 29 type refcursortype is ref cursor; 30 procedure open_ref_cur(cur1 out refcursortype); 31 procedure fetch_ref_cur(cur1 in refcursortype, c1 out number,c2 out varchar2); 32 end refcurpkg;", 33 "CREATE or REPLACE PACKAGE body refcurpkg is 34 procedure open_ref_cur(cur1 out refcursortype) is 35 begin 36 open cur1 for select * from refcurtest order by c1; 37 end open_ref_cur; 38 procedure fetch_ref_cur(cur1 in refcursortype, c1 out number, 39 c2 out varchar2) is 40 begin 41 fetch cur1 into c1,c2; 42 end fetch_ref_cur; 43 end refcurpkg;" 44 ); 45 46oci8_test_sql_execute($c, $stmtarray); 47 48// Insert 500 rows into the table. 49$insert_sql = "INSERT INTO refcurtest (c1, c2) VALUES (:c1,:c2)"; 50if (!($s = oci_parse($c, $insert_sql))) { 51 die("oci_parse(insert) failed!\n"); 52} 53 54for ($i = 0; $i <= 500; $i++) { 55 $val2 = 'test'.$i; 56 oci_bind_by_name($s,':c1',$i); 57 oci_bind_by_name($s,':c2',$val2); 58 if (!oci_execute($s)) { 59 die("oci_execute(insert) failed!\n"); 60 } 61} 62 63// Steps to Fetch from PHP . For every sub-test,the cursor is bound and then executed. 64 65$sql1 = "begin refcurpkg.open_ref_cur(:cur1); end;"; 66$s1 = oci_parse($c,$sql1); 67$cur1 = oci_new_cursor($c); 68if (!oci_bind_by_name($s1,":cur1",$cur1,-1,SQLT_RSET)) { 69 die("oci_bind_by_name(sql1) failed!\n"); 70} 71 72 73// Steps to Fetch from PL/SQL . For every sub-test,the cursor is bound and then executed. 74 75$sql2 = "begin refcurpkg.fetch_ref_cur(:curs1,:c1,:c2); end;"; 76$s2 = oci_parse($c,$sql2); 77if (!oci_bind_by_name($s2, ":curs1", $cur1, -1, SQLT_RSET)) { 78 die("oci_bind_by_name(sql2) failed!\n"); 79} 80if (!oci_bind_by_name($s2, ":c1", $c1, -1, SQLT_INT)) { 81 die("oci_bind_by_name(sql2) failed!\n"); 82} 83if (!oci_bind_by_name($s2, ":c2", $c2, 20, SQLT_CHR)) { 84 die("oci_bind_by_name(sql2) failed!\n"); 85} 86 87 88echo "------Test 1- Check Roundtrips with prefetch 0 and 5 -----------\n"; 89oci_execute($s1); 90oci_execute($cur1); 91$initial_rt = print_roundtrips($c); 92oci_set_prefetch($cur1,0); 93for ($i = 0;$i<5;$i++) { 94 var_dump(oci_fetch_row($cur1)); 95} 96 97$cnt = (print_roundtrips($c) - $initial_rt); 98echo "Number of roundtrips made with prefetch count 0 for 5 rows is $cnt\n"; 99 100$initial_rt = print_roundtrips($c); 101oci_set_prefetch($cur1,5); 102for ($i = 0;$i<5;$i++) { 103 var_dump(oci_fetch_row($cur1)); 104} 105 106$cnt = (print_roundtrips($c) - $initial_rt ); 107echo "Number of roundtrips made with prefetch count 5 for 5 rows is $cnt\n"; 108 109echo "------Test 2 - Set Prefetch before PL/SQL fetch ----------\n"; 110// Fetch from PHP 111$cur1 = oci_new_cursor($c); 112if (!oci_bind_by_name($s1,":cur1",$cur1,-1,SQLT_RSET)) { 113 die("oci_bind_by_name(sql1) failed!\n"); 114} 115 116echo "Fetch Row from PHP\n"; 117oci_execute($s1); 118oci_execute($cur1); 119var_dump(oci_fetch_row($cur1)); 120oci_set_prefetch($cur1,5); 121 122// Fetch from PL/SQL 123if (!oci_bind_by_name($s2,":curs1",$cur1,-1,SQLT_RSET)) { 124 die("oci_bind_by_name(sql2) failed!\n"); 125} 126oci_execute($s2); 127echo "Fetch Row from PL/SQL\n"; 128var_dump($c1); 129var_dump($c2); 130 131function print_roundtrips($c) { 132 $sql_stmt = "select value from v\$mystat a,v\$statname c where 133 a.statistic#=c.statistic# and c.name='SQL*Net roundtrips to/from client'"; 134 $s = oci_parse($c,$sql_stmt); 135 oci_define_by_name($s,"VALUE",$value); 136 oci_execute($s); 137 oci_fetch($s); 138 return $value; 139} 140 141// Clean up here 142 143$stmtarray = array( 144 "drop package refcurpkg", 145 "drop table refcurtest" 146); 147 148oci8_test_sql_execute($c, $stmtarray); 149 150echo "Done\n"; 151?> 152--EXPECTF-- 153------Test 1- Check Roundtrips with prefetch 0 and 5 ----------- 154array(2) { 155 [0]=> 156 string(1) "0" 157 [1]=> 158 string(5) "test0" 159} 160array(2) { 161 [0]=> 162 string(1) "1" 163 [1]=> 164 string(5) "test1" 165} 166array(2) { 167 [0]=> 168 string(1) "2" 169 [1]=> 170 string(5) "test2" 171} 172array(2) { 173 [0]=> 174 string(1) "3" 175 [1]=> 176 string(5) "test3" 177} 178array(2) { 179 [0]=> 180 string(1) "4" 181 [1]=> 182 string(5) "test4" 183} 184Number of roundtrips made with prefetch count 0 for 5 rows is 6 185array(2) { 186 [0]=> 187 string(1) "5" 188 [1]=> 189 string(5) "test5" 190} 191array(2) { 192 [0]=> 193 string(1) "6" 194 [1]=> 195 string(5) "test6" 196} 197array(2) { 198 [0]=> 199 string(1) "7" 200 [1]=> 201 string(5) "test7" 202} 203array(2) { 204 [0]=> 205 string(1) "8" 206 [1]=> 207 string(5) "test8" 208} 209array(2) { 210 [0]=> 211 string(1) "9" 212 [1]=> 213 string(5) "test9" 214} 215Number of roundtrips made with prefetch count 5 for 5 rows is 2 216------Test 2 - Set Prefetch before PL/SQL fetch ---------- 217Fetch Row from PHP 218array(2) { 219 [0]=> 220 string(1) "0" 221 [1]=> 222 string(5) "test0" 223} 224Fetch Row from PL/SQL 225int(101) 226string(%d) "test101" 227Done 228