Oracle 11g DB возвращает потоки вместо строк
У меня здесь новая база данных, и это обновленная версия с Oracle 10g до Oracle 11g - основная проблема связана со столбцами LOB, и каждый раз, когда какая-либо функция возвращает LOB в результате, новая база данных не будет возвращать строки, как это делала старая:
Старая база данных:
["C"]=>
string(23) "3874163,3874197,3874201"
Новая база данных:
["C"]=>
resource(182) of type (stream)
Теперь при чтении потоков иногда возникает ошибка несуществующего ресурса потока, на который ссылаются, и все выходит из строя. Я предполагаю, что связь тем временем прервалась без считывания потока и, следовательно, доступа теряется.
При изменении операторов для включения приведения к varchar, например:
CONVERT(VARCHAR, C, 120)
Или вот так:
SELECT TO_CHAR(FUNC())
Значение снова возвращается в виде строки, но на самом деле это не оптимальное решение, так как необходимо изменить каждое утверждение.
Есть ли какой-либо способ/возможность предотвратить доставку посылок в виде потоков, чтобы они вместо этого доставлялись в виде строк, как в Oracle 10 г?
Редактировать:
Мы используем набор функций oci для доступа к бд.
3 answers
На самом деле это не ответ как таковой, а несколько пунктов, которые, я надеюсь, помогут.
Похоже, что есть небольшая разница в способе возврата отправлений между 10g и 11g, в разделе 11g есть некоторые примечания о преобразовании из btyes в byteStreams, когда количество отправлений превышает определенное значение, в справочном руководстве JDBC (я понимаю, что это не влияет на вызовы OCI, поскольку они используют другой набор драйверов).
Из того, что я вижу с точки зрения функций OCI8 в php, работа функций выборки по умолчанию заключается в том, что поля возвращаются в качестве ссылки и должны быть доступны с помощью ->read()
->load()
функции etc (см. http://au.php.net/oci_fetch_array - относительно режима и значения по умолчанию).
Теперь я не знаю, используете ли вы функции OCI для доступа к вашей системе Oracle, поскольку это не указано в вашем вопросе.
Пара других пунктов, которые помогли бы разобраться в этом, были бы, если бы вы могли сообщить нам, перекомпилировали ли вы php или обновил драйверы oracle с более новой версией клиента вообще.
Я знаю, что это не полное решение, но если вы используете oci_fetch_*
для возврата строки, добавьте второй аргумент к вызову OCI_RETURN_LOBS
, это приведет к тому, что выборка вернет строку поля LOB вместо ссылки на поток, или используйте $variable["C"]->load()
для доступа к этому объекту, это заставит его загрузить полный поток и действовать как обычная строка.
Надеюсь, это поможет.
Если вы используете PDO, вам может потребоваться изменить PDO::PARAM_LOB на PDO::PARAM_STR. Например, в сочетании со столбцом привязки:
$statement->bindColumn(1, $as_string, PDO::PARAM_STR, 256);
$statement->bindColumn(1, $as_lob, PDO::PARAM_LOB);
При использовании LOBs вы должны использовать либо OCI::прочитать , либо OCI::загрузить, чтобы получить их содержимое.
[...]
$row = oci_fetch_assoc($result);
$lobContents = $row['LOB_COLUMN']->load(); //fetches the whole LOB
//or
while ($buffer = $row['LOB_COLUMN']->read(4096)) { //sequential read
$lobContents .= $buffer;
}