1--TEST--
2Prefetch with REF cursor. Test different values for prefetch with oci_set_prefetch().
3--SKIPIF--
4<?php if (!extension_loaded('oci8')) die("skip no oci8 extension");
5if (!extension_loaded('oci8')) die("skip no oci8 extension");
6require(__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// Various values for prefetch
64$pref = array(0,1,501,499,250,12345,-12345,-1);
65foreach($pref as $value) {
66    echo"-----------------------------------------------\n";
67    echo "Test with Prefetch value set to $value \n";
68    echo"-----------------------------------------------\n";
69    $cur1 = oci_new_cursor($c);
70    fetch_frm_php($c,$cur1,$value);
71    fetch_frm_plsql($c,$cur1);
72}
73
74
75// This function sets the prefetch count to the given $value and fetches one row .
76
77function fetch_frm_php($c,$cur1,$value) {
78    $sql1 = "begin refcurpkg.open_ref_cur(:cur1); end;";
79    $s1 = oci_parse($c,$sql1);
80    if (!oci_bind_by_name($s1,":cur1",$cur1,-1,SQLT_RSET)) {
81        die("oci_bind_by_name(sql1) failed!\n");
82    }
83    oci_execute($s1);
84    oci_set_prefetch($cur1,$value);
85    oci_execute($cur1);
86    echo "Fetch Row from PHP\n";
87    var_dump(oci_fetch_row($cur1));
88}
89
90// This function calls the fetch_ref_cur procedure to get the values from the REF cur.
91
92function fetch_frm_plsql($c,$cur1) {
93    $sql2 = "begin refcurpkg.fetch_ref_cur(:curs1,:c1,:c2); end;";
94    $s2 = oci_parse($c,$sql2);
95    if (!oci_bind_by_name($s2,":curs1",$cur1,-1,SQLT_RSET)) {
96        die("oci_bind_by_name(sql2) failed!\n");
97    }
98    if (!oci_bind_by_name($s2,":c1",$c1,-1,SQLT_INT)) {
99        die("oci_bind_by_name(sql2) failed!\n");
100    }
101    if (!oci_bind_by_name($s2,":c2",$c2,20,SQLT_CHR)) {
102        die("oci_bind_by_name(sql2) failed!\n");
103    }
104    oci_execute($s2);
105    echo "Fetch Row from PL/SQL\n";
106    var_dump($c1);
107    var_dump($c2);
108}
109
110// Clean up  here
111
112$stmtarray = array(
113    "drop package refcurpkg",
114    "drop table refcurtest"
115);
116
117oci8_test_sql_execute($c, $stmtarray);
118
119echo "Done\n";
120?>
121--EXPECTF--
122-----------------------------------------------
123Test with Prefetch value set to 0
124-----------------------------------------------
125Fetch Row from PHP
126array(2) {
127  [0]=>
128  string(%d) "0"
129  [1]=>
130  string(%d) "test0"
131}
132Fetch Row from PL/SQL
133int(1)
134string(%d) "test1"
135-----------------------------------------------
136Test with Prefetch value set to 1
137-----------------------------------------------
138Fetch Row from PHP
139array(2) {
140  [0]=>
141  string(%d) "0"
142  [1]=>
143  string(%d) "test0"
144}
145Fetch Row from PL/SQL
146int(2)
147string(%d) "test2"
148-----------------------------------------------
149Test with Prefetch value set to 501
150-----------------------------------------------
151Fetch Row from PHP
152array(2) {
153  [0]=>
154  string(%d) "0"
155  [1]=>
156  string(%d) "test0"
157}
158
159Warning: oci_execute(): ORA-01002: %s
160ORA-06512: at "%s.REFCURPKG", line %d
161ORA-06512: at line %d in %s on line %d
162Fetch Row from PL/SQL
163int(0)
164NULL
165-----------------------------------------------
166Test with Prefetch value set to 499
167-----------------------------------------------
168Fetch Row from PHP
169array(2) {
170  [0]=>
171  string(%d) "0"
172  [1]=>
173  string(%d) "test0"
174}
175Fetch Row from PL/SQL
176int(500)
177string(%d) "test500"
178-----------------------------------------------
179Test with Prefetch value set to 250
180-----------------------------------------------
181Fetch Row from PHP
182array(2) {
183  [0]=>
184  string(%d) "0"
185  [1]=>
186  string(%d) "test0"
187}
188Fetch Row from PL/SQL
189int(251)
190string(%d) "test251"
191-----------------------------------------------
192Test with Prefetch value set to 12345
193-----------------------------------------------
194Fetch Row from PHP
195array(2) {
196  [0]=>
197  string(%d) "0"
198  [1]=>
199  string(%d) "test0"
200}
201
202Warning: oci_execute(): ORA-01002: %s
203ORA-06512: at "%s.REFCURPKG", line %d
204ORA-06512: at line %d in %s on line %d
205Fetch Row from PL/SQL
206int(0)
207NULL
208-----------------------------------------------
209Test with Prefetch value set to -12345
210-----------------------------------------------
211
212Warning: oci_set_prefetch(): Number of rows to be prefetched has to be greater than or equal to 0 in %s on line %d
213Fetch Row from PHP
214array(2) {
215  [0]=>
216  string(%d) "0"
217  [1]=>
218  string(%d) "test0"
219}
220Fetch Row from PL/SQL
221int(101)
222string(%d) "test101"
223-----------------------------------------------
224Test with Prefetch value set to -1
225-----------------------------------------------
226
227Warning: oci_set_prefetch(): Number of rows to be prefetched has to be greater than or equal to 0 in %s on line %d
228Fetch Row from PHP
229array(2) {
230  [0]=>
231  string(%d) "0"
232  [1]=>
233  string(%d) "test0"
234}
235Fetch Row from PL/SQL
236int(101)
237string(%d) "test101"
238Done
239