Xpoint
   [напомнить пароль]

DBD::Oracle BLOB в курсоре

Метки: [без меток]
2006-05-03 18:30:32 [обр] konst5[досье]

Вызываю процедуру, которая возвращает мне курсор
...
$sth->bind_param_inout(":cursor",$cursor, 0, { ora_type => ORA_RSET })
...
while (my ($pole1,$pole2,$pole3) = $cursor->fetchrow_array ) {
#получаю данные
}


Все это хорошо работает, пока в курсоре не встречается одно из полей типа BLOB, тогда мне возвращается вместо данных этого поля OCILobLocatorPtr=SCALAR(0x832ce58)...


Поискал в интернете - ничего не нашел. Может кто здесь подскажет как вытащить данные?
PS. Суть в том, что мне возвращается только курсор, а не какие ":out"

спустя 20 минут [обр] Алексей Севрюков(61/1292)[досье]
konst5[досье] $$blob_field? Кстати, пишите в форум по Модулям, а сам модуль не указали?
спустя 35 минут [обр] konst5[досье]
Я модуль в заголовке темы указал (DBD::Oracle)...
т.е. ($pole1, $pole2, $pole3) =>($pole1, $pole2, $$pole3) ?
Я подозреваю, что мне возвращается некий указатель, а чтобы извлечь данные надо использовать что-то типа $cursor->... Только вот не пойму что
спустя 34 минуты [обр] Алексей Севрюков(61/1292)[досье]
konst5[досье] Ой, простите, название модуля не заметил.
Посмотрите здесь: Handling LOBs
спустя 10 минут [обр] konst5[досье]
там уже смотрел. Мне надо видимо это:
$data = $dbh->ora_lob_read($lob_locator, $offset, $length);
Но как я определю $lob_locator? Я пытался my $data = $dbh->ora_lob_read($field3, 1, 10000), но это не проходит...
спустя 8 часов [обр] Закиров Руслан(51/343)[досье]

konst5[досье] На сколько я понимаю, если ora_auto_lob правда, то драйвер сам вытаскивает данные и локатор не нужно применять. У Вас в оригинальном коде возвращается ссылка на скаляр, приведенный код менять не нужно, но там где вы собираетесь использовать переменную $pole3, нужно добавить $ ($$pole3) чтобы получить данные по ссылке. Читаем perldoc perlreftut.

Можно и с локатором сделать, но для этого нужно ora_auto_lob присвоить 0.

спустя 7 часов [обр] Алексей Севрюков(61/1292)[досье]
Закиров Руслан[досье] OCILobLocatorPtr=SCALAR(0x832ce58) - что-то мне кажется что это все таки объект, хотя попробывать сослаться на скаляр тоже стоит попробовать.
спустя 2 часа 10 минут [обр] konst5[досье]

интересный результат получился... Вот отрывок подпрограмки, которая возвращает данные:
...
while (my @tab = $cursor->fetchrow_array ) {
#последнее значение в @tab - BLOB
    my (@out2);
    my $blob;
    foreach (@tab) {
   push (@out2,$_);
   $blob = $_;
    }
# my $data = $dbh->ora_lob_read($blob, 1, 10000) || err_mes('READ_BLOB',$errN); ;
# использую $$blob
    pop(@out2);push(@out2,$$blob);
    my $out = join("\t",@out2);
    push (@out,$out);
}
$sth->finish || err_mes('FINISH',$errN);
return @out;
...


В этом случае мне возращается набор цифр "137206180"... может просто десятичное представление SCALAR?
Это не те данные, что в этом поле...
+ проблема: если я испльзую
use strict;
как потом объявить $$blob?

спустя 13 минут [обр] konst5[досье]
независимо от "ora_auto_lob"
    $dbh = DBI->connect($database, $dbuser, $dbpass, $dbtype,{ RaiseError => 0, AutoCommit => 0,ora_auto_lob => 0 });
    $dbh = DBI->connect($database, $dbuser, $dbpass, $dbtype,{ RaiseError => 0, AutoCommit => 0,ora_auto_lob => 1 });
один и тот же результат:
       my $test = pop(@tab);
       $test && print "TEST=$test = (",$$test,")\n";
выдает:
OCILobLocatorPtr=SCALAR(0x832dfcc) = (137207780)
спустя 30 минут [обр] Алексей Севрюков(61/1292)[досье]

konst5[досье]
А этот вариант у Вас работает?

my $data = $dbh->ora_lob_read($blob, 1, 10000) || err_mes('READ_BLOB',$errN);

С разными ora_auto_lob?

спустя 48 минут [обр] konst5[досье]
>$data = $dbh->ora_lob_read($blob, 1, 10000)
во всех случаях: locator is not of type OCILobLocatorPtr (делал и $$blob и $blob =~s/^.+=//;...)
спустя 30 минут [обр] Алексей Севрюков(61/1292)[досье]

konst5[досье] Похоже на глюк модуля, у Вас последний стоит?

(делал и $$blob и $blob =~s/^.+=//;...)

А вот этого делать не надо, ora_lob_read принимает в качестве параметра ссылку, а не строку.

Попробуйте еще bind_param, модет он поможет.

спустя 2 часа 10 минут [обр] konst5[досье]

ВСЕМ СПАСИБО! ВСЕ ПОЛУЧИЛОСЬ ЧЕРЕЗ:
if ($field3) {
 $data = $sth->$dbh->ora_lob_read($field3,1,10000));
}


PS. экспериментально выяснено, что ora_auto_lob - ни на что не влияет

Powered by POEM™ Engine Copyright © 2002-2005