PostreSgl typ text v Oracle + perl DBI

Honza Pazdziora adelton na informatics.muni.cz
Úterý Listopad 6 10:04:44 CET 2001


On Mon, Nov 05, 2001 at 11:58:40PM +0000, Arnost Valicek wrote:
> 
> kterym typem Oracle (v8) by bylo nejlepsi nahradit typ 'text' z PostgreSQL
> abych musel co nejmene upravovat program v perlu (DBI). 
> 
> Skousel jsem pouzit CLOB. Ale moc mi to nefunguje, v manualovych

Ano, CLOB.

> 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.

> by to melo nejak fungovat (ja mam zatim opacnou skusenost - viz priklad
> na konci)

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.

> 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.

> Tzn. zadna vata typu bind_param...

Ne.

> 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?

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
   .project: Perl, DBI, Oracle, MySQL, auth. WWW servers, DBD::XBase.
------------------------------------------------------------------------


Další informace o konferenci Databases