Oznámení
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.