tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Dibi a Oracle CLOB dlhé stringy

před 7 lety

cosmo
Člen | 6

Zdravím priaznivcov Dibi.

Pravdepodobne 99% programátorov používa dibi nad MySQL, ja som nútený používať Oracle 10.2. Všetko čo potrebujem funguje bezproblémov až na dlhé stringy CLOB.

Problém je nasledovný:

Ak mám údaj v CLOB stĺpci, dibi mi nevráti text, musím pretypovávať priamo v DB pomocou TO_NCHAR(COL). Toto som zatiaľ vyriešil úpravou driveru oracle.php:

<?php
    public function fetch($assoc)
    {
    return oci_fetch_array($this->resultSet, ($assoc ? OCI_ASSOC : OCI_NUM) | OCI_RETURN_NULLS | OCI_RETURN_LOBS);
    }
?>

Myslím, že toto by mohlo byť v oracle driveri ako default.

Situáciu pri načítavaní to rieši, problém mám so zapisovaním dlhých stringov, spravidla viac ako 4kB sa nedajú bežne zapísať a dostanem chybové hlásenie. To býva rôzne, v zmysle toho, že som prekročil maximálnu veľkosť, ktorú môžem vložiť ako varchar2 aj keď stĺpec je CLOB. Hlásenia pohľadám podrobne, mám ich kdesi odložené.

Vyriešil som to takýmto workaroundom (z diskusných fór), ktorý používam pri INSERT/UPDATE:

declare
vClobVal varchar2(32768) := ' Dlhyyyy string ';
begin
update TABULKA set STLPEC = vClobVal;
end;

Kde STLPEC je CLOB a string môže byť prakticky lubovolne dlhý (cca 32kB) a vkladám ho cez %s ako v bežných Dibi dotazoch. Nech som robil čokoľvek, nepodarilo sa mi vložiť žiadnym spôsobom CLOB dlhší ako 4kB. Konkrétne chybové hlásenia pohľadám, ale pri hľadaní to vždy riešili pomocou vloženej procedúry alebo podobne ako vyššie, cez declare. Prípadne cez binding variables, čo mi príde ako krajne nevhodné.
Robím niekde chybu, alebo je toto jedna z mnohých divných vlastností Oracle ? Pri MySQL som sa nikdy nestretol s niečím podobným. Poznáte niekto lepšie riešenie, prípadne niekde robím chybu ? Píšem hlavne z dôvodu toho, že sa mi toto riešenie zdá nepekné a možno to niektorým programátorom pomôže ak sa dostanú k podobným „chybám“ pri Oracle.
Nepredpokladám, že ide o chybu Dibi, ale ťažko sa rozhodujem, kam toto zaradiť.

Ďakujem každému za prípadnú odpoveď :-)

Dibi používam v 2.0.1 štandardnú, PHP 5.3 na Gentoo Linuxe x64, OCI8 php extension.

před 7 lety

Milo
Nette Core | 1119

Asi před rokem jsem to v PHP řešil, ale bez dibi. Pokud se pamatuji, omezení délky dotazu spočívá v samotné OCI/PHP knihovně. Použil jsem postup s EMPTY_CLOB() a RETURNING, který popisují na stránkách Oracle. S dibi by to mělo jít, v PostgreSQL používám RETURNING běžně.

před 7 lety

cosmo
Člen | 6

Ďakujem za radu a za link. Pozriem si to a vyskúšam. Zatiaľ som použil tú metódu s declare, pre moje účely to funguje. Ale určite skúsim spraviť to univerzálne a čisto.