Oracle 11g DB возвращает потоки вместо строк - PullRequest
6 голосов
/ 10 января 2012

У меня здесь есть новая база данных, и это обновленная версия с Oracle 10g до Oracle 11g - основная проблема связана со столбцами больших объектов, и каждый раз, когда любая функция возвращает большой объект, в результате новая база данных не будет возвращать строки, подобные старый сделал:

Старая БД:

["C"]=>
string(23) "3874163,3874197,3874201"

Новая БД:

["C"]=>
resource(182) of type (stream)

Теперь при чтении потоков иногда возникает ошибка, связанная с несуществующим ресурсом потока, на который ссылаются, и все терпит неудачу. Я предполагаю, что соединение тем временем закрыто без чтения потока, и поэтому доступ потерян.

При изменении операторов для включения приведения к varchar, например:

CONVERT(VARCHAR, C, 120)

Или вот так:

SELECT TO_CHAR(FUNC())

Значение снова возвращается в виде строки, но это не совсем оптимальное решение, поскольку каждый оператор должен быть изменен.

Есть ли какой-либо способ / опция, предотвращающая доставку больших объектов в виде потоков, поэтому вместо этого они доставляются в виде строк, как в Oracle 10g?

Edit:
Мы используем набор функций oci для доступа к БД.

Ответы [ 3 ]

1 голос
/ 12 января 2012

Не совсем ответ как таковой, но несколько пунктов, которые, я надеюсь, помогут.

Похоже, есть небольшая разница в том, как возвращаются большие объекты между 10g и 11g, под 11g есть некоторыепримечания о преобразовании btyes в byteStreams, когда LOB превышают определенное значение, в справочном руководстве JDBC (я понимаю, что это не влияет на вызовы OCI, поскольку они используют другой набор драйверов).

Из того, что я вижус точки зрения функций OCI8 в php, операция по умолчанию для функций выборки заключается в том, что большие объекты возвращаются в качестве ссылки и должны быть доступны с использованием функций ->read() ->load() и т. д. (см. http://au.php.net/oci_fetch_array - относительнорежим и значение по умолчанию).

Теперь я не знаю, используете ли вы функции OCI для доступа к вашей системе оракула, поскольку она не указана в вашем вопросе.

Пара других элементов, которые могут помочь ввыяснить это можно было бы, если бы вы могли сообщить нам, если вы перекомпилировали php или обновили драйверы oracle с помощью новой клиентской базы.версия ent вообще.

Я знаю, что это не полное решение, но если вы используете oci_fetch_* для возврата строки, добавьте второй аргумент к вызову OCI_RETURN_LOBS, это приведет к возвращению выборкистрока поля LOB вместо ссылки на поток, или используйте $variable["C"]->load() для доступа к этому LOB, это заставит его загрузить полный поток и действовать как обычная строка.

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

0 голосов
/ 14 января 2012

При использовании больших объектов вы должны использовать OCI :: read или OCI :: load , чтобы получить их содержимое.

[...]
$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 голосов
/ 12 января 2012

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

$statement->bindColumn(1, $as_string, PDO::PARAM_STR, 256);
$statement->bindColumn(1, $as_lob, PDO::PARAM_LOB);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...