1--TEST-- 2PL/SQL oci_bind_by_name with SQLT_AFC aka CHAR to VARCHAR2 parameter 3--SKIPIF-- 4<?php 5if (!extension_loaded('oci8')) die ("skip no oci8 extension"); 6require(__DIR__."/connect.inc"); 7// The bind buffer size edge cases seem to change each DB version. 8preg_match('/.*Release ([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)*/', oci_server_version($c), $matches); 9if (!(isset($matches[0]) && $matches[1] < 12)) { 10 die("skip expected output only valid when using pre-Oracle 12c database"); 11} 12?> 13--ENV-- 14NLS_LANG=.AL32UTF8 15--FILE-- 16<?php 17 18// Same test as bind_char_3 but the PL/SQL function uses VARCHAR2 instead of CHAR 19 20require(__DIR__.'/connect.inc'); 21 22// Initialization 23 24$stmtarray = array( 25 "create or replace function bind_char_3_fn(p1 varchar2) return varchar2 as begin return p1; end;", 26); 27 28oci8_test_sql_execute($c, $stmtarray); 29 30// Run Test 31 32echo "Test 1.1 In Length: default. In Type: default. Out Length: default. Out Type: default\n"; 33 34$s = oci_parse($c, "begin :bv2 := bind_char_3_fn(:bv1); end;"); 35$bv1 = 'abc'; 36$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2); 37if ($r) 38 do_e($s); 39var_dump($bv1, $bv2); 40 41echo "Test 1.2 In Length: default. In Type: default. Out Length: 10. Out Type: default\n"; 42 43$bv1 = 'abc'; 44$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2, 10); 45if ($r) 46 do_e($s); 47var_dump($bv1, $bv2); 48 49 50echo "Test 1.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default\n"; 51 52$bv1 = 'abc'; 53$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10); 54if ($r) 55 do_e($s); 56var_dump($bv1, $bv2); 57 58 59 60echo "Test 1.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n"; 61 62$bv1 = 'abc'; 63$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC); 64if ($r) 65 do_e($s); 66var_dump($bv1, $bv2); 67 68 69echo "Test 1.5 In Length: strlen. In Type: AFC. Out Length: strlen(input). Out Type: AFC\n"; 70 71$bv1 = 'abc'; 72$r = oci_bind_by_name($s, ':bv1', $bv1, strlen($bv1), SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, strlen($bv1), SQLT_AFC); 73if ($r) 74 do_e($s); 75var_dump($bv1, $bv2); 76 77 78echo "Test 1.6 In Length: strlen. In Type: AFC. Out Length: strlen(input)-1. Out Type: AFC\n"; 79 80$bv1 = 'abc'; 81$r = oci_bind_by_name($s, ':bv1', $bv1, strlen($bv1), SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, strlen($bv1)-1, SQLT_AFC); 82if ($r) 83 do_e($s); 84var_dump($bv1, $bv2); 85 86 87echo "Test 1.7 In Length: strlen. In Type: AFC. Out Length: strlen(input)+1. Out Type: AFC\n"; 88 89$bv1 = 'abc'; 90$r = oci_bind_by_name($s, ':bv1', $bv1, strlen($bv1), SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, strlen($bv1)+1, SQLT_AFC); 91if ($r) 92 do_e($s); 93var_dump($bv1, $bv2); 94 95 96echo "\n\nTests with ''\n\n"; 97 98echo "Test 2.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n"; 99 100$bv1 = ''; 101$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC); 102if ($r) 103 do_e($s); 104var_dump($bv1, $bv2); 105 106 107echo "Test 2.2 In Length: default. In Type: default. Out Length: 10. Out Type: default\n"; 108 109$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2, 10); 110if ($r) 111 do_e($s); 112var_dump($bv1, $bv2); 113 114 115 116echo "Test 2.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default\n"; 117 118$bv1 = ''; 119$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10); 120if ($r) 121 do_e($s); 122var_dump($bv1, $bv2); 123 124 125 126echo "Test 2.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n"; 127 128$bv1 = ''; 129$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC); 130if ($r) 131 do_e($s); 132var_dump($bv1, $bv2); 133 134 135 136echo "Test 2.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC\n"; 137 138$bv1 = ''; 139$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 0, SQLT_AFC); 140if ($r) 141 do_e($s); 142var_dump($bv1, $bv2); 143 144 145 146echo "Test 2.6 In Length: 0. In Type: AFC. Out Length: 0. Out Type: AFC\n"; 147 148$bv1 = ''; 149$r = oci_bind_by_name($s, ':bv1', $bv1, 0, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 0, SQLT_AFC); 150if ($r) 151 do_e($s); 152var_dump($bv1, $bv2); 153 154 155 156echo "Test 2.7 In Length: 1. In Type: AFC. Out Length: 1. Out Type: AFC\n"; 157 158$bv1 = ''; 159$r = oci_bind_by_name($s, ':bv1', $bv1, 1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 1, SQLT_AFC); 160if ($r) 161 do_e($s); 162var_dump($bv1, $bv2); 163 164 165 166echo "\n\nTests with NULL\n"; 167 168echo "Test 3.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n"; 169 170$bv1 = null; 171$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC); 172if ($r) 173 do_e($s); 174var_dump($bv1, $bv2); 175 176 177echo "Test 3.2 In Length: default. In Type: default. Out Length: 10. Out Type: default\n"; 178 179$bv1 = null; 180$r = oci_bind_by_name($s, ':bv1', $bv1) && oci_bind_by_name($s, ':bv2', $bv2, 10); 181if ($r) 182 do_e($s); 183var_dump($bv1, $bv2); 184 185 186 187echo "Test 3.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default\n"; 188 189$bv1 = null; 190$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10); 191if ($r) 192 do_e($s); 193var_dump($bv1, $bv2); 194 195 196 197echo "Test 3.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC\n"; 198 199$bv1 = null; 200$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 10, SQLT_AFC); 201if ($r) 202 do_e($s); 203var_dump($bv1, $bv2); 204 205 206echo "Test 3.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC\n"; 207 208$bv1 = null; 209$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 0, SQLT_AFC); 210if ($r) 211 do_e($s); 212var_dump($bv1, $bv2); 213 214 215 216echo "Test 3.6 In Length: -1. In Type: AFC. Out Length: 1. Out Type: AFC\n"; 217 218$bv1 = null; 219$r = oci_bind_by_name($s, ':bv1', $bv1, -1, SQLT_AFC) && oci_bind_by_name($s, ':bv2', $bv2, 1, SQLT_AFC); 220if ($r) 221 do_e($s); 222var_dump($bv1, $bv2); 223 224 225function do_e($s) 226{ 227 echo " Executing:\n"; 228 229 $r = @oci_execute($s); 230 if (!$r) { 231 $m = oci_error($s); 232 echo " Oci_execute error ORA-".$m['code']."\n"; 233 return; 234 } 235} 236 237// Cleanup 238 239$stmtarray = array( 240 "drop function bind_char_3_fn" 241); 242 243oci8_test_sql_execute($c, $stmtarray); 244 245echo "Done\n"; 246 247?> 248--EXPECT-- 249Test 1.1 In Length: default. In Type: default. Out Length: default. Out Type: default 250 Executing: 251 Oci_execute error ORA-6502 252string(3) "abc" 253NULL 254Test 1.2 In Length: default. In Type: default. Out Length: 10. Out Type: default 255 Executing: 256string(3) "abc" 257string(3) "abc" 258Test 1.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default 259 Executing: 260string(3) "abc" 261string(3) "abc" 262Test 1.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC 263 Executing: 264string(3) "abc" 265string(10) "abc " 266Test 1.5 In Length: strlen. In Type: AFC. Out Length: strlen(input). Out Type: AFC 267 Executing: 268string(3) "abc" 269string(3) "abc" 270Test 1.6 In Length: strlen. In Type: AFC. Out Length: strlen(input)-1. Out Type: AFC 271 Executing: 272 Oci_execute error ORA-6502 273string(3) "abc" 274string(3) "abc" 275Test 1.7 In Length: strlen. In Type: AFC. Out Length: strlen(input)+1. Out Type: AFC 276 Executing: 277string(3) "abc" 278string(4) "abc " 279 280 281Tests with '' 282 283Test 2.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC 284 Executing: 285string(0) "" 286NULL 287Test 2.2 In Length: default. In Type: default. Out Length: 10. Out Type: default 288 Executing: 289string(0) "" 290NULL 291Test 2.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default 292 Executing: 293string(0) "" 294NULL 295Test 2.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC 296 Executing: 297string(0) "" 298NULL 299Test 2.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC 300 Executing: 301string(0) "" 302NULL 303Test 2.6 In Length: 0. In Type: AFC. Out Length: 0. Out Type: AFC 304 Executing: 305string(0) "" 306NULL 307Test 2.7 In Length: 1. In Type: AFC. Out Length: 1. Out Type: AFC 308 Executing: 309string(0) "" 310NULL 311 312 313Tests with NULL 314Test 3.1 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC 315 Executing: 316NULL 317NULL 318Test 3.2 In Length: default. In Type: default. Out Length: 10. Out Type: default 319 Executing: 320NULL 321NULL 322Test 3.3 In Length: -1. In Type: AFC. Out Length: 10. Out Type: default 323 Executing: 324NULL 325NULL 326Test 3.4 In Length: -1. In Type: AFC. Out Length: 10. Out Type: AFC 327 Executing: 328NULL 329NULL 330Test 3.5 In Length: -1. In Type: AFC. Out Length: 0. Out Type: AFC 331 Executing: 332NULL 333NULL 334Test 3.6 In Length: -1. In Type: AFC. Out Length: 1. Out Type: AFC 335 Executing: 336NULL 337NULL 338Done 339