Обрабатывать столбцы CLOB с помощью PHP-ODBC


Я поддерживаю устаревшее приложение, которое работает на PHP/5.2.6 под управлением Windows Server 2003 и подключается к удаленному серверу Oracle 10g через ODBC. Я пишу новую функцию, которой нужна колонка CLOB, чтобы она могла хранить произвольно большие тексты, но я не могу найти способ управлять ею с помощью старых добрых функций ODBC.

Для написания я попробовал такой подход:

<?php

$sql = 'INSERT INTO FOO (FOO_ID, FOO_CLOB) VALUES (?, ?)';
$stmt = odbc_prepare($conn, $sql);
$res = odbc_execute($stmt, array(1, 'Very large string'));

?>

Но как только строка будет больше 4000 байт:

Ошибка SQL: [Microsoft][Драйвер ODBC для Oracle] Ошибка в el parámetro 2: Данные усечение, состояние SQL 01004 в SQLExecute

... что примерно означает "Усеченные данные". У меня аналогичная проблема при чтении: он работает нормально, пока я не получу более 4000 байт.

Можно ли манипулировать столбцом CLOB объемом более 4000 байт с помощью функций PHP ODBC?

( Моя альтернатива - хранить материалы в файлах и сохранять путь к файлу только в БД, но я бы хотел избежать этого, если возможный.)


Обновление: Следуя совету Джастина Кейва, я отказался от драйвера ODBC Microsoft в пользу Oracle, и мой код вставляет большие строки без изменений. Теперь мой вопрос заключается в том, как читать колонку CLOB. Читая его как есть:

$sql = 'SELECT FOO_ID, FOO_CLOB FROM FOO';
$res = odbc_exec($conn, $sql);
while($row = odbc_fetch_array($res)){
    // ...
}

...запускает это при запуске odbc_fetch_array():

ORA-01861: литерал не соответствует строке формата

Author: Community, 2011-04-05

2 answers

Обязательно ли использовать драйвер Microsoft ODBC для Oracle? Этот драйвер не поддерживает тип данных CLOB среди различных других проблем. Если вместо этого вы используете драйвер Oracle ODBC, драйвер будет поддерживать CLOBs.

 3
Author: Justin Cave, 2011-04-05 08:51:38

Для того, чтобы прочитать вас, в основном, вам нужно просмотреть данные.

Что-то вроде --

define ("MAX_LONGREAD_LENGTH", 4000);

$res = odbc_exec($con, $sql);

odbc_binmode($res, ODBC_BINMODE_RETURN);

$oflen = odbc_field_len($res, 1);

if ( $oflen >= MAX_LONGREAD_LENGTH)
{
  $out = '';

  do
  {
    $temp = odbc_result($res, 1);

    if ($temp != null) $out .= $temp;
  }

  while ($temp != null);
}

else

{
  $out = odbc_result($res, 1);
}

- что, в принципе, либо -

  1. Считывает все данные, если
  2. Многократно считывает и добавляет фрагменты данных, пока больше не будет возвращено.
 1
Author: Garry M. Biggs, 2011-04-15 12:56:36