Обрабатывать столбцы CLOB с помощью PHP-ODBC - PullRequest
2 голосов
/ 05 апреля 2011

Я поддерживаю устаревшее приложение, которое работает на 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] Ошибка en el parámetro 2:Datos truncados, состояние 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: литерал не соответствует строке формата

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

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

1 голос
/ 15 апреля 2011

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

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

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. Считывает все данные, если <6000 символов, или </li>
  2. Неоднократно, читает и добавляет куски данных до тех пор, пока больше не будет возвращено.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...