Поддержка CLOB в PDO: есть или не есть?

Крейт

Новичок
Поддержка CLOB в PDO: есть или не есть?

Доброго времени суток, коллеги.
Столкнулся с проблемой невозможности добавления данных в поля типа CLOB, используя библиотеку pdo_oci.
Более подробно проблема описана здесь, здесь и здесь (вторая сверху запись). Моя ситуация абсолютно аналогична тем, что приведены по ссылкам выше. Создаю запрос, делаю привязку переменных к CLOB-полю данных с использованием PDO::pARAM_LOB, при запуске запроса на выполнение появляется ошибка "ORA-00932: inconsistent datatypes: expected BLOB got CLOB".
Все это возникло на конфигурации Apache 2.0.59 (win32), php 5.2.5, Oracle 10g. И еще аналогичная конфигурация под никсами, только версия php - 5.2.3
Вопрос: как с этим бороться? Существуют ли какие-то обходные пути без внесения изменений в исходный код pdo-библиотеки? Будет ли этот баг исправлен в ближайшее время?
Сижу уже второй день в гугле, внимательно изучаю документацию, но пока решения не нашел. Очень не хотелось бы из-за этого отказываться от использования PDO в проекте.
Чтобы не быть голословным:
PHP:
$db = new PDO("oci:dbname=orcl", "login", "password");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $db->prepare("insert into clobtest (clob_field) " .
          . "VALUES (EMPTY_CLOB()) RETURNING clob_field INTO ?");
$data = "enormous amount of character data";
$stmt->bindParam(1, $data, PDO::PARAM_LOB);

$db->beginTransaction();
try {
    $stmt->execute();
} catch (Exception $e) {
    die($e->getMessage());
}
$db->commit();
 

Falc

Новичок
Крейт
С PDO никогда не работал, но код выглядит странным.
Например я не вижу строчки кода, которая записывает clob.

А напрямую вставить clob через PDO нельзя?
 

Крейт

Новичок
tony2001: к этому все идет. Придется маленько код переписать.

Falc
CLOB записывается при выполнении $stmt->execute(). Данные для записи мы через bindParam привязываем предварительно. В мануале точно такой же пример (http://php.net/pdo, Example#14), только там идет работа с BLOB-полем данных, поэтому там все нормально. Напрямую простым INSERT-запросом, без привязки переменных, можно, но при попытке добавить данные объемом более 4000 символов опять-таки возникает ошибка еще более непонятного характера ("ORA-01461: допускается привязка LONG значения только для занесения в столбец LONG").
 

Falc

Новичок
Посмотрел доку по PDO, фунций работы с лобами там вообще нету, он сам каким-то образом пытается понять что делать с лобом.

Как вариант можно попробовать сделать инсерт внутри процедуры.
 

Крейт

Новичок
Falc
Посмотрел доку по PDO, фунций работы с лобами там вообще нету, он сам каким-то образом пытается понять что делать с лобом.
Да вот же ж. А в OCI8 все-таки есть OCI-Lob.
Насчет процедуры я подумывал, еще не решил, как поступить. Утром буду тестировать, в сторону пакета dbms_lob смотреть надо.
 
Сверху