получение данных из CLOB поля

anDeRan

Новичок
получение данных из CLOB поля

Пытаюсь получить данные через:

PHP:
$result = oci_parse($link, "SELECT id, subject, body, stamp FROM " . $_CONFIG['db']['news'] . " WHERE id=" . $request[1] . " AND ROWNUM=1");
oci_execute($result, OCI_DEFAULT);
$data = oci_fetch_array($result, OCI_RETURN_LOBS);

echo $data[2]->load();
//var_dump($data);
$data[2] (CLOB поле) возращает пустоту, с остальными все нормально... и при попытке $data[2]->load(); вылетает ошибка...

замучалса... везде приводятся простые примеры, которые у мя не работают... что странно - данные есть в базе данных - это показывает Toad for Oracle и Eclipse DbEdit.

Apache/2.0.55 (Ubuntu), PHP/5.1.2, Oracle 10g
 

tony2001

TeaM PHPClub
var_dump($data); - ?

>и при попытке $data[2]->load(); вылетает ошибка...
"а сейчас вылетит птичка", блин.
 

anDeRan

Новичок
array ..... 2 => '' (length=0) ....

ошибка:
Fatal error: Call to a member function load() on a non-object in /home/....../news.inc.php on line 13
 

tony2001

TeaM PHPClub
>array ..... 2 => '' (length=0) ....
можно просто copy/paste, без самостоятельных додумок и изменений?

тип поля какой?
 

anDeRan

Новичок
мм уже нашел твой совет:
http://pecl.php.net/bugs/bug.php?id=8184

помогло, tnx :)
 

LexxTIP

Новичок
пожожая проблема, но в случае с юникодом

Похожая проблема!
Кодировка UTF-8 и тоже самое поле типа CLOB. Размер данных определяется посимвольно (нормально для юникода), но извлечение побайтно. В итоге у меня примерно половина текста не выбирается из БД банальным SELECT'ом.
Чем это лечить?

Пример: в БД хранится строка в 410 цифр. size() возвращает 410 (что собственно верно!), но read() читает 410 байт, а не символов юникода и в итоге на выходе получается только 136 цифр, вместо 410.

PHP:
print_r(sql_select_clob('SELECT field FROM table'));

function sql_select_clob($sql_string)
{
    global $DB;

    $DB->DbConnect();

    $ar = array();

    $sql = oci_parse($DB->link, $sql_string);
    oci_execute($sql, OCI_DEFAULT);
    while(oci_fetch($sql)){
        $o = oci_result($sql, 'field');
        $ar[]  = $o->read($o->size());
    }
    return $ar;
}
(подразумевается, что в глобальной переменной $DB уже есть экземпляр класса с открытым соединением)

-~{}~ 27.09.07 17:14:

Проблему решил!

Для корректной выборки строк из полей типа CLOB в Оракле, применяйте к
столбцу конвертер TO_SINGLE_BYTE()
http://www-eleves-isia.cma.fr/documentation/OracleDoc/TO-SINGLE-BYTE.html
иначе размер строки (особенно с большим числом национальных символов)
будет определяться неверно и она будет обрезаться.

например:
SELECT TO_SINGLE_BYTE(field) FROM table;
 
Сверху