PostreSgl typ text v Oracle + perl DBI

Arnost Valicek xvalicek na fi.muni.cz
Úterý Listopad 6 15:03:46 CET 2001


In article <20011106100444.D11114 na anxur.fi.muni.cz>, "Honza Pazdziora"
<adelton na informatics.muni.cz> wrote:

>> strankach DBD::Oracle se pise, ze pro insert/update mam pouzit neco
>> jako $sth->($field_num, $lob_value, { ora_type => ORA_CLOB });, pro
>> select
> Ano, protoze DBD::Oracle za Vas dela vsechny ty manipulace s id toho
> CLOBu a vlastnim obsahem. Pokud je v tabulce vice LOBovych sloupcu, je
> nutne (pri insertu/updatu) i ora_field.

To je bohuzel i muj pripad, 3 sloupce...

> Pro selecty jsou podstatne hodnoty atributu LongReadLen a LongTruncOk --
> opet, DBD::Oracle za Vas dela vsechny ready a takto je potreba mu rict,
> kolik pameti si na ty velke retezce ma vyhradit.

To znamena ze musim nejak odhadnout/omezit(nebo si nekam poznacit) delku
nejvetsiho retezce v CLOB sloupcich?  Je mi to Oracle/DBI nejak shopno
sdelit? Nejak to nemuzu najit.

>> Je tedy vubec mozne s Oracle a DBI pouzit typ CLOB (nebo neco jinebo
>> pro dlouhe texty), tak abych s tim mohl pracovat stejne jako napriklad
>> s varchar?
> Nebudete s tim moct pracovat jako s varchar, uz treba proto, ze nad tim
> neudelate index, a neudelate podle toho distinct a group by.
Tim "jako s varchar" sem spis myslel tak pohodlne v perlu, ne v ramci SQL
prikazu. Index mam na jinych sloupcich, tabulka je myslena jako skladiste
textu. Mne by stacilo, kdyby v tom sel vyhledat nejaky retezec, ale ani
to neni nutne... 

>> Tzn. zadna vata typu bind_param...
> Ne.
To "Ne" je mysleno na CLOB nebo na jakykoliv typ, do ktereho dostanu
text delsi nez 4kb ?

>> jak mi to pracuje aspon na jednoduchem prikladu:  v SQL:
>> create table blb1
>> (
>>   t1 CLOB,
>>   t2 CLOB
>> );
>> v perlu:
>> ---
>> my $sth;
>> $sth=$dbh->prepare("insert into blb1 values (?,?)");
>> $sth->execute('x','y');
>> ---
>> funguje...
> No, ono to (mozna) funguje, protoze vlastne vkladate varchar2 do CLOBu a
> ten varchar je maly, takze si Oracle vnitnr provede konverzi typu
> (zalezi na verzi). Ale pokud byste misto 'x' a 'y' dal neco delsiho nez
> 4000 znaku, tak budete mit problem.
>> --
>> $sth=$dbh->prepare("select * from blb1"); $sth->execute;
>> my $hash_ref;
>> while ($hash_ref = $sth->fetchrow_hashref) {
>>   print "$$hash_ref{t1}         $$hash_ref{t2}\n";
>> }
>> ---
>> uz nefunguje...
> Co to znamena, nefunguje?
> 
>> perl vypise:
>> DBD::Oracle::db prepare failed: ORA-03115: unsupported network datatype
>> or representation (DBD: odescr failed) at ../clobtest.pl line 34. Can't
>> call method "execute" without a package or object reference at
>> ../clobtest.pl line 35.
>> (34. radek je radek s
>> "$sth=$dbh->prepare("insert into blb1 values (?,?)");")
> A tohle by teda svedcilo na to, ze Vam neprojde ani ten prvni priklad, o
> kterem rikate "funguje". Cili jak to je? Projde Vam vubec ten prepare s
> insertem?
> 
Kdyz zakomentuju cast s "select..." a poustim skript, tam mi v tabulce
pribyvaji radky s ('x','y'), kdyz zakomentuju cast s "insert" a povolim
tu se "select" tak to pise chybu viz vyse...


-- 
Arnost Valicek <xvalicek na fi.muni.cz>


Další informace o konferenci Databases