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 для доступа к бд.

Author: bardiir, 2012-01-10

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() для доступа к этому объекту, это заставит его загрузить полный поток и действовать как обычная строка.

Надеюсь, это поможет.

 1
Author: Payload, 2012-01-13 03:03:20

Если вы используете PDO, вам может потребоваться изменить PDO::PARAM_LOB на PDO::PARAM_STR. Например, в сочетании со столбцом привязки:

$statement->bindColumn(1, $as_string, PDO::PARAM_STR, 256);
$statement->bindColumn(1, $as_lob, PDO::PARAM_LOB);
 0
Author: DIDoS, 2012-01-12 01:04:24

При использовании 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;
}
 0
Author: capi, 2012-01-14 17:13:13