diff --git a/UPGRADING b/UPGRADING index 3b02ec4bf3f..0e4dfc42b69 100644 --- a/UPGRADING +++ b/UPGRADING @@ -28,9 +28,10 @@ PHP 8.2 UPGRADE NOTES HTTP method in curl_getinfo() return value. - OCI8: - . Added an oci8.prefetch_lob_size directive to tune LOB query performance - by reducing the number of round-trips between PHP and Oracle Database when - fetching LOBS. This is usable with Oracle Database 12.2 or later. + . Added an oci8.prefetch_lob_size directive and oci_set_prefetch_lob() + function to tune LOB query performance by reducing the number of + round-trips between PHP and Oracle Database when fetching LOBS. This is + usable with Oracle Database 12.2 or later. - PCRE: . Added support for the "n" (NO_AUTO_CAPTURE) modifier, which makes simple diff --git a/ext/oci8/config.m4 b/ext/oci8/config.m4 index 89da625e27b..09eae79692c 100644 --- a/ext/oci8/config.m4 +++ b/ext/oci8/config.m4 @@ -211,7 +211,13 @@ if test "$PHP_OCI8" != "no"; then oci8_php_version=`expr [$]1 \* 1000000 + [$]2 \* 1000 + [$]3` if test "$oci8_php_version" -lt "5002000"; then - AC_MSG_ERROR([You need at least PHP 5.2.0 to be able to use this version of OCI8. PHP $php_version found]) + AC_MSG_ERROR([You need at least PHP 8.1.0 to be able to use this version of OCI8. Use OCI8 1.4 for PHP $php_version]) + elif test "$oci8_php_version" -lt "7000000"; then + AC_MSG_ERROR([You need at least PHP 8.1.0 to be able to use this version of OCI8. Use OCI8 2.0 for PHP $php_version]) + elif test "$oci8_php_version" -lt "8000000"; then + AC_MSG_ERROR([You need at least PHP 8.1.0 to be able to use this version of OCI8. Use OCI8 2.2 for PHP $php_version]) + elif test "$oci8_php_version" -lt "8001000"; then + AC_MSG_ERROR([You need at least PHP 8.1.0 to be able to use this version of OCI8. Use OCI8 3.0 for PHP $php_version]) else AC_MSG_RESULT([$php_version, ok]) fi diff --git a/ext/oci8/oci8.c b/ext/oci8/oci8.c index 8efb04ea0f6..38dcfc42f35 100644 --- a/ext/oci8/oci8.c +++ b/ext/oci8/oci8.c @@ -35,6 +35,9 @@ #ifdef HAVE_OCI8 +/* Note to maintainers: config.m4 should/does check the minimum PHP version so + * the below checks are obsolete - but are kept 'just in case' */ + /* PHP 5.2 is the minimum supported version for OCI8 2.0 */ #if PHP_MAJOR_VERSION < 5 || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION <= 1) #error Use PHP OCI8 1.4 for your version of PHP @@ -42,8 +45,10 @@ /* PHP 7 is the minimum supported version for OCI8 2.1 */ #error Use PHP OCI8 2.0 for your version of PHP #elif PHP_MAJOR_VERSION < 8 -/* PHP 8 is the minimum supported version for OCI8 3.0 */ +/* PHP 8 is the minimum supported version for OCI8 3 */ #error Use PHP OCI8 2.2 for your version of PHP +#elif PHP_MAJOR_VERSION == 8 && PHP_MINOR_VERSION < 1 +#error Use PHP OCI8 3.0 for your version of PHP #endif #include "php_oci8.h" @@ -174,7 +179,7 @@ PHP_INI_BEGIN() #if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) STD_PHP_INI_BOOLEAN("oci8.events", "0", PHP_INI_SYSTEM, OnUpdateBool, events, zend_oci_globals, oci_globals) #endif - STD_PHP_INI_ENTRY( "oci8.prefetch_lob_size", "0", PHP_INI_ALL, OnUpdateLong, prefetch_lob_size, zend_oci_globals, oci_globals) + STD_PHP_INI_ENTRY( "oci8.prefetch_lob_size", "0", PHP_INI_SYSTEM, OnUpdateLong, prefetch_lob_size, zend_oci_globals, oci_globals) PHP_INI_END() /* }}} */ diff --git a/ext/oci8/oci8.stub.php b/ext/oci8/oci8.stub.php index cf24b20a74a..efedc3eb906 100644 --- a/ext/oci8/oci8.stub.php +++ b/ext/oci8/oci8.stub.php @@ -381,6 +381,9 @@ function oci_set_prefetch($statement, int $rows): bool {} */ function ocisetprefetch($statement, int $rows): bool {} +/** @param resource $statement */ +function oci_set_prefetch_lob($statement, int $prefetch_lob_size): bool {} + /** @param resource $connection */ function oci_set_client_identifier($connection, string $client_id): bool {} diff --git a/ext/oci8/oci8_arginfo.h b/ext/oci8/oci8_arginfo.h index 26bc20bcc70..b6916e49c37 100644 --- a/ext/oci8/oci8_arginfo.h +++ b/ext/oci8/oci8_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 46ee8ce62b36639636b4f5126e20a4b4e1df2e25 */ + * Stub hash: 9db587b5d431b9dfe7178fd843ae8907db737a04 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_oci_define_by_name, 0, 3, _IS_BOOL, 0) ZEND_ARG_INFO(0, statement) @@ -299,6 +299,11 @@ ZEND_END_ARG_INFO() #define arginfo_ocisetprefetch arginfo_oci_set_prefetch +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_oci_set_prefetch_lob, 0, 2, _IS_BOOL, 0) + ZEND_ARG_INFO(0, statement) + ZEND_ARG_TYPE_INFO(0, prefetch_lob_size, IS_LONG, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_oci_set_client_identifier, 0, 2, _IS_BOOL, 0) ZEND_ARG_INFO(0, connection) ZEND_ARG_TYPE_INFO(0, client_id, IS_STRING, 0) @@ -596,6 +601,7 @@ ZEND_FUNCTION(oci_num_fields); ZEND_FUNCTION(oci_parse); ZEND_FUNCTION(oci_get_implicit_resultset); ZEND_FUNCTION(oci_set_prefetch); +ZEND_FUNCTION(oci_set_prefetch_lob); ZEND_FUNCTION(oci_set_client_identifier); ZEND_FUNCTION(oci_set_edition); ZEND_FUNCTION(oci_set_module_name); @@ -710,6 +716,7 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(oci_get_implicit_resultset, arginfo_oci_get_implicit_resultset) ZEND_FE(oci_set_prefetch, arginfo_oci_set_prefetch) ZEND_DEP_FALIAS(ocisetprefetch, oci_set_prefetch, arginfo_ocisetprefetch) + ZEND_FE(oci_set_prefetch_lob, arginfo_oci_set_prefetch_lob) ZEND_FE(oci_set_client_identifier, arginfo_oci_set_client_identifier) ZEND_FE(oci_set_edition, arginfo_oci_set_edition) ZEND_FE(oci_set_module_name, arginfo_oci_set_module_name) diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 7668e102ba5..d277e0441d3 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1633,6 +1633,30 @@ PHP_FUNCTION(oci_set_prefetch) } /* }}} */ +/* {{{ Sets the amount of LOB data to be prefetched when OCI LOB locators are fetched */ +PHP_FUNCTION(oci_set_prefetch_lob) +{ + zval *z_statement; + php_oci_statement *statement; + zend_long prefetch_lob_size; + + ZEND_PARSE_PARAMETERS_START(2, 2) + Z_PARAM_RESOURCE(z_statement) + Z_PARAM_LONG(prefetch_lob_size) + ZEND_PARSE_PARAMETERS_END(); + + PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); + + if (prefetch_lob_size < 0) { + zend_argument_value_error(2, "must be greater than or equal to 0"); + RETURN_THROWS(); + } + + statement->prefetch_lob_size = (ub4) prefetch_lob_size; + RETURN_TRUE; +} +/* }}} */ + /* {{{ Sets the client identifier attribute on the connection */ PHP_FUNCTION(oci_set_client_identifier) { diff --git a/ext/oci8/oci8_statement.c b/ext/oci8/oci8_statement.c index 5ee04a6168e..4db6337dbcd 100644 --- a/ext/oci8/oci8_statement.c +++ b/ext/oci8/oci8_statement.c @@ -117,6 +117,12 @@ php_oci_statement *php_oci_statement_create(php_oci_connection *connection, char php_oci_statement_set_prefetch(statement, (ub4)100); /* semi-arbitrary, "sensible default" */ } + if (OCI_G(prefetch_lob_size) > 0) { + statement->prefetch_lob_size = (ub4)OCI_G(prefetch_lob_size); + } else { + statement->prefetch_lob_size = 0; + } + PHP_OCI_REGISTER_RESOURCE(statement, le_statement); OCI_G(num_statements)++; @@ -173,6 +179,7 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement) GC_ADDREF(statement2->connection->id); php_oci_statement_set_prefetch(statement2, statement->prefetch_count); + statement2->prefetch_lob_size = statement->prefetch_lob_size; PHP_OCI_REGISTER_RESOURCE(statement2, le_statement); @@ -186,7 +193,7 @@ php_oci_statement *php_oci_get_implicit_resultset(php_oci_statement *statement) /* {{{ php_oci_statement_set_prefetch() Set prefetch buffer size for the statement */ -int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch ) +int php_oci_statement_set_prefetch(php_oci_statement *statement, ub4 prefetch) { sword errstatus; @@ -820,18 +827,30 @@ int php_oci_statement_execute(php_oci_statement *statement, ub4 mode) return 1; } + /* Enable LOB data prefetching */ + if ((outcol->data_type == SQLT_CLOB || outcol->data_type == SQLT_BLOB) && statement->prefetch_lob_size > 0) { + int get_lob_len = 1; /* == true */ + + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &get_lob_len, 0, OCI_ATTR_LOBPREFETCH_LENGTH, statement->err)); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus); + PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); + return 1; + } + + PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &(statement->prefetch_lob_size), 0, OCI_ATTR_LOBPREFETCH_SIZE, statement->err)); + if (errstatus != OCI_SUCCESS) { + statement->errcode = php_oci_error(statement->err, errstatus); + PHP_OCI_HANDLE_ERROR(statement->connection, statement->errcode); + return 1; + } + } + /* additional define setup */ switch (outcol->data_type) { + case SQLT_RSET: case SQLT_BLOB: case SQLT_CLOB: - if (OCI_G(prefetch_lob_size) > 0) { - int get_lob_len = 1; /* == true */ - ub4 prefetch_size = OCI_G(prefetch_lob_size); - PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &get_lob_len, 0, OCI_ATTR_LOBPREFETCH_LENGTH, statement->err)); - PHP_OCI_CALL_RETURN(errstatus, OCIAttrSet, (outcol->oci_define, OCI_HTYPE_DEFINE, &prefetch_size, 0, OCI_ATTR_LOBPREFETCH_SIZE, statement->err)); - } - ZEND_FALLTHROUGH; - case SQLT_RSET: case SQLT_RDD: case SQLT_BFILE: PHP_OCI_CALL_RETURN(errstatus, diff --git a/ext/oci8/package.xml b/ext/oci8/package.xml index 25de0a9867d..61bb1ad7641 100644 --- a/ext/oci8/package.xml +++ b/ext/oci8/package.xml @@ -10,7 +10,9 @@ http://pear.php.net/dtd/package-2.0.xsd"> The OCI8 extension lets you access Oracle Database. -Use 'pecl install oci8' to install for PHP 8. +Use 'pecl install oci8' to install for PHP 8.1. + +Use 'pecl install oci8-3.0.1' to install for PHP 8.0. Use 'pecl install oci8-2.2.0' to install for PHP 7. @@ -53,7 +55,7 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin no - 2021-11-15 + 2021-12-11 @@ -66,9 +68,9 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin PHP - This version is for PHP 8 only. + This version is for PHP 8.1 only. - Added oci8.prefetch_lob_size directive to improve LOB query performance. + Added oci8.prefetch_lob_size directive and oci_set_prefetch_lob() function to improve LOB query performance. @@ -373,6 +375,8 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin + + @@ -435,7 +439,7 @@ Oracle's standard cross-version connectivity applies. For example, PHP OCI8 lin - 8.0.0 + 8.1.0 1.4.0b1 diff --git a/ext/oci8/php_oci8_int.h b/ext/oci8/php_oci8_int.h index b2e5f88c26b..dec9172f5c5 100644 --- a/ext/oci8/php_oci8_int.h +++ b/ext/oci8/php_oci8_int.h @@ -235,7 +235,8 @@ typedef struct { unsigned has_data:1; /* statement has more data flag */ unsigned has_descr:1; /* statement has at least one descriptor or cursor column */ ub2 stmttype; /* statement type */ - ub4 prefetch_count; /* current prefetch count */ + ub4 prefetch_count; /* row prefetch count */ + ub4 prefetch_lob_size; /* LOB prefetch size */ } php_oci_statement; /* }}} */ diff --git a/ext/oci8/tests/lob_prefetch.phpt b/ext/oci8/tests/lob_prefetch.phpt index 0fbdb160330..94a85585a8e 100755 --- a/ext/oci8/tests/lob_prefetch.phpt +++ b/ext/oci8/tests/lob_prefetch.phpt @@ -13,14 +13,14 @@ require(__DIR__.'/skipif.inc'); require __DIR__.'/connect.inc'; require __DIR__.'/create_table.inc'; -define("NUMROWS", 500); +define("NUMROWS", 200); define("LOBSIZE", 64000); $ora_sql = "declare c clob; b blob; - numrows number := 500; + numrows number := " . NUMROWS . "; dest_offset integer := 1; src_offset integer := 1; warn integer; @@ -44,8 +44,10 @@ $statement = oci_parse($c,$ora_sql); oci_execute($statement); -function get_clob_loc($c, $sql) { +function get_clob_loc($c, $sql, $pfl) { $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); oci_execute($stid); $l = []; while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) { @@ -56,8 +58,10 @@ function get_clob_loc($c, $sql) { return($l); } -function get_clob_inline($c, $sql) { +function get_clob_inline($c, $sql, $pfl) { $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); oci_execute($stid); $l = []; while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS)) != false) { @@ -81,8 +85,10 @@ function check_clobs($locarr, $inlinearr) { } } -function get_blob_loc($c, $sql) { +function get_blob_loc($c, $sql, $pfl) { $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); oci_execute($stid); $l = []; while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) { @@ -94,22 +100,28 @@ function get_blob_loc($c, $sql) { } -print("Test 1\n"); +print("Test 1 - Default prefetch_lob_size\n"); -$ig = ini_get("oci8.prefetch_lob_size"); -var_dump($ig); +$r = ini_get("oci8.prefetch_lob_size"); +var_dump($r); -$ig = ini_set("oci8.prefetch_lob_size", "100000"); -var_dump($ig); +print("Test 2\n"); -$ig = ini_get("oci8.prefetch_lob_size"); -var_dump($ig); +$s = oci_parse($c, 'select * from dual'); +$r = oci_set_prefetch_lob($s, 0); +var_dump($r); -print("Test 2 - CLOB prefetch_lob_size 100000\n"); +try { + oci_set_prefetch_lob($s, -1); +} catch (ValueError $e) { + echo $e->getMessage(), "\n"; +} + +print("Test 3 - CLOB prefetch_lob_size 100000\n"); $sql = "select clob from ${schema}${table_name}" . " order by id"; -$locarr = get_clob_loc($c, $sql); -$inlinearr = get_clob_inline($c, $sql); +$locarr = get_clob_loc($c, $sql, 100000); +$inlinearr = get_clob_inline($c, $sql, 100000); print(count($locarr) . "\n"); print(count($inlinearr) . "\n"); @@ -117,12 +129,8 @@ check_clobs($locarr, $inlinearr); print("Test 3 - CLOB prefetch_lob_size 100\n"); -ini_set("oci8.prefetch_lob_size", "100"); -$ig = ini_get("oci8.prefetch_lob_size"); -var_dump($ig); - -$locarr = get_clob_loc($c, $sql); -$inlinearr = get_clob_inline($c, $sql); +$locarr = get_clob_loc($c, $sql, 100); +$inlinearr = get_clob_inline($c, $sql, 100); print(count($locarr) . "\n"); print(count($inlinearr) . "\n"); @@ -130,12 +138,8 @@ check_clobs($locarr, $inlinearr); print("Test 4 - BLOB prefetch_lob_size 100000\n"); -ini_set("oci8.prefetch_lob_size", "100000"); -$ig = ini_get("oci8.prefetch_lob_size"); -var_dump($ig); - $sql = "select blob from ${schema}${table_name}" . " order by id"; -$locarr = get_blob_loc($c, $sql); +$locarr = get_blob_loc($c, $sql, 100000); print(count($locarr) . "\n"); @@ -144,20 +148,19 @@ require __DIR__.'/drop_table.inc'; ?> DONE --EXPECTF-- -Test 1 +Test 1 - Default prefetch_lob_size string(1) "0" -string(1) "0" -string(6) "100000" -Test 2 - CLOB prefetch_lob_size 100000 -500 -500 +Test 2 +bool(true) +oci_set_prefetch_lob(): Argument #2 ($prefetch_lob_size) must be greater than or equal to 0 +Test 3 - CLOB prefetch_lob_size 100000 +200 +200 Comparing CLOBS Test 3 - CLOB prefetch_lob_size 100 -string(3) "100" -500 -500 +200 +200 Comparing CLOBS Test 4 - BLOB prefetch_lob_size 100000 -string(6) "100000" -500 +200 DONE diff --git a/ext/oci8/tests/lob_prefetch_ini.phpt b/ext/oci8/tests/lob_prefetch_ini.phpt new file mode 100755 index 00000000000..2142a8e0ece --- /dev/null +++ b/ext/oci8/tests/lob_prefetch_ini.phpt @@ -0,0 +1,165 @@ +--TEST-- +LOB prefetching with oci8. +--EXTENSIONS-- +oci8 +--SKIPIF-- + true, 'timesten' => false); // test runs on these DBs +require(__DIR__.'/skipif.inc'); +?> +--INI-- +oci8.prefetch_lob_size=100000 +--FILE-- += 0) + oci_set_prefetch_lob($stid, $pfl); + oci_execute($stid); + $l = []; + while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) { + $l[] = $row['CLOB']->load(); + $row['CLOB']->free(); + if (strlen($l[0]) != LOBSIZE) { print("strlen(l) failure" . strlen($l)); exit; } + } + return($l); +} + +function get_clob_inline($c, $sql, $pfl) { + $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); + oci_execute($stid); + $l = []; + while (($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS)) != false) { + $l[] = $row['CLOB']; + if (strlen($l[0]) != LOBSIZE) { print("strlen(l) failure" . strlen($l)); exit; } + } + return($l); +} + +function check_clobs($locarr, $inlinearr) { + print("Comparing CLOBS\n"); + for ($i = 0; $i < NUMROWS; ++$i) { + if (strlen($locarr[$i]) != LOBSIZE) { + trigger_error("size mismatch at $i " . strlen($locarr[$i]), E_USER_ERROR); + exit; + } + if (strcmp($locarr[$i], $inlinearr[$i])) { + trigger_error("data mismatch at $i " . strlen($locarr[$i]) . " " . strlen($inlinearr[$i]), E_USER_ERROR); + exit; + } + } +} + +function get_blob_loc($c, $sql, $pfl) { + $stid = oci_parse($c, $sql); + if ($pfl >= 0) + oci_set_prefetch_lob($stid, $pfl); + oci_execute($stid); + $l = []; + while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) { + $l[] = $row['BLOB']->load(); + $row['BLOB']->free(); + if (strlen($l[0]) != LOBSIZE) { print("strlen(l) failure" . strlen($l)); exit; } + } + return($l); +} + + +print("Test 1 - prefetch_lob_size\n"); + +$r = ini_get("oci8.prefetch_lob_size"); +var_dump($r); + +print("Test 2 - CLOB with current oci8.prefetch_lob_size\n"); + +$sql = "select clob from ${schema}${table_name}" . " order by id"; +$locarr = get_clob_loc($c, $sql, -1); +$inlinearr = get_clob_inline($c, $sql, -1); + +print(count($locarr) . "\n"); +print(count($inlinearr) . "\n"); +check_clobs($locarr, $inlinearr); + +print("Test 3 - CLOB override prefetch_lob_size 0\n"); + +$locarr = get_clob_loc($c, $sql, 0); +$inlinearr = get_clob_inline($c, $sql, 0); + +print(count($locarr) . "\n"); +print(count($inlinearr) . "\n"); +check_clobs($locarr, $inlinearr); + +print("Test 4 - CLOB override prefetch_lob_size 1000\n"); + +$locarr = get_clob_loc($c, $sql, 1000); +$inlinearr = get_clob_inline($c, $sql, 1000); + +print(count($locarr) . "\n"); +print(count($inlinearr) . "\n"); +check_clobs($locarr, $inlinearr); + +print("Test 5 - BLOB with current ocig8.prefetch_lob_size \n"); + +$sql = "select blob from ${schema}${table_name}" . " order by id"; +$locarr = get_blob_loc($c, $sql, -1); + +print(count($locarr) . "\n"); + +require __DIR__.'/drop_table.inc'; + +?> +DONE +--EXPECTF-- +Test 1 - prefetch_lob_size +string(6) "100000" +Test 2 - CLOB with current oci8.prefetch_lob_size +200 +200 +Comparing CLOBS +Test 3 - CLOB override prefetch_lob_size 0 +200 +200 +Comparing CLOBS +Test 4 - CLOB override prefetch_lob_size 1000 +200 +200 +Comparing CLOBS +Test 5 - BLOB with current ocig8.prefetch_lob_size +200 +DONE diff --git a/php.ini-production b/php.ini-production index e25092e688f..89a198db395 100644 --- a/php.ini-production +++ b/php.ini-production @@ -1273,7 +1273,7 @@ mysqlnd.collect_memory_statistics = Off ; https://php.net/oci8.statement-cache-size ;oci8.statement_cache_size = 20 -; Tuning: Enables statement prefetching and sets the default number of +; Tuning: Enables row prefetching and sets the default number of ; rows that will be fetched automatically after statement execution. ; https://php.net/oci8.default-prefetch ;oci8.default_prefetch = 100