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 Test