602SQL-Úplná dokumentace Index  

Manipulace s typy proměnné délky v PHP

V PHP modulu můžeme pracovat s hodnotami databázových typů proměnné délky dvěma způsoby: buď je budeme číst z otevřených kurzorů přímo, nebo k manipulaci s nimi použijeme tzv. LOB resource handle.

Databázové typy proměnné délky jsou typy CLOB, NCLOB a BLOB.

První způsob (mód práce s LOBy) se označuje jako WB_LOBMODE_DIRECT, druhý jako WB_LOBMODE_RESOURCE. Mód práce s LOBy lze nastavit pro každý otevřený kurzor zvlášť, a to pomocí funkce wb_set_lob_mode, přičemž standardně je pro nově otevřený kurzor nastaven mód WB_LOBMODE_DIRECT.

Práce s LOBy v módu WB_LOBMODE_DIRECT

Tento mód slouží k přímému získání hodnoty LOBu. Čtení LOBů je ovlivněno nastavením parametrů wb_longreadlen a wb_binmode. Hodnoty těchto parametrů lze nastavit pro každý kurzor; standardní (default) hodnota je čerpána z globálního nastavení v PHP.INI v okamžiku vytvoření kurzoru.

Pokud čteme text proměnné délky v Unicode (SQL typ NCLOB), PHP modul provede automaticky konverzi z kódování UCS-2, ve kterém jsou texty uloženy v 602SQL, do kódování UTF-8, se kterým se snadněji pracuje v PHP. Tato konverze se provádí i při čtení textu v módu wb_binmode=WB_PASSTHRU, tj. do výstupního proudu bude zapsán text v kódování UTF-8.

Parametr wb_binmode může nabývat třech hodnot: WB_PASSTHRU, WB_RETURN, a WB_CONVERT. První hodnota znamená, že hodnoty atributů proměnné délky budou místo uložení do proměnné přímo poslány do výstupního proudu PHP, zatímco do proměnné bude uložena prázdná hodnota. V některých případech (např. ve funkci wb_result_all tento způsob výstupu nemá valný smysl, a hodnota tohoto typu je potom v podstatě ignorována. Hodnota WB_RETURN znamená, že hodnota bude uložena do řetězcové proměnné tak, jak je, zatímco WB_CONVERT tuto hodnotu u binárních typů převede do hexadecimálního tvaru. Pro nebinární typy (TEXT) jsou obě hodnoty ekvivalentní.

Pokud má parametr wb_binmode jednu z hodnot WB_RETURN či WB_CONVERT, je uložen do proměnné jen začátek atributu proměnné délky. Délka uložené části v bajtech je určena parametrem wb_longreadlen.

Standardní hodnota parametru wb_longreadlen je 4096, standardní hodnota parametru wb_binmode je WB_CONVERT. Tyto hodnoty se použijí v případě, že v PHP.INI nebudou tyto parametry uvedeny.

Příklad:

Příklad použití parametru WB_PASSTHRU v módu WB_LOBMODE_DIRECT. Mějme otevřený kurzor, kde v prvním sloupci je obrázek v gif formátu. Chceme poslat browseru tento obrázek.

/* Výstup nikoliv do výstupní proměnné, ale přímo do PHP proudu */ 
wb_binmode($res, WB_PASSTHRU);
/* zkus, zda existuje alespoň první řádek */
if(!wb_fetch_row($res)) die("Error in fetch_row");
/* Můžeme nastavit HTTP hlavičku s typem na gif. */
header("content-type: image/gif");
/* Pošli data. Protože je nastaveno passthru, data z kurzoru jdou přímo na výstup. */ 
wb_result($res, 1);

Funkce pro práci s LOBy v módu WB_LOBMODE_RESOURCE

V tomto módu jsou LOBy zpřístupněny pomocí tzv. handles. Funkce, které by v předcházejícím módu vrátily hodnotu LOBu (např. wb_result), nyní LOB otevřou (připraví jej pro provádění operací na něm) a vrátí resource handle (indentifikační číslo) LOBu, pomocí kterého se budeme na LOB odkazovat při volání funkcí, které provádějí na LOBu operace čtení a zápisu. Na LOBy otevřené v tomto módu nemají hodnoty parametrů wb_binmode a wb_longreadlen žádný vliv.

Příklad: Přečtení prvních 50 znaků z hodnoty sloupce typu CLOB (v prvním řádku dotazu):

$cursor=wb_exec($connection, "SELECT clob_column FROM clob_table");
wb_fetch_row($cursor);
wb_set_lob_mode($cursor,WB_LOBMODE_RESOURCE);
$clob=wb_result($cursor,"clob_column");
$initial50=wb_lob_read($clob,0,50);
...
wb_close($clob);
wb_close($cursor);

Výhodou tohoto módu je to, že lze číst hodnotu LOBu po částech, zatímco v předchozím módu bylo možno přečíst pouze počáteční úsek hodnoty LOBu.Dále lze, pomocí funkce wb_lob_write, přepsat část hodnoty LOBu, pouze však u těch LOBů, které byly otevřeny z editovatelných kurzorů.

LOB je otevřen a nový LOB resource handle je vytvořen pokaždé, když v tomto módu zavoláme funkci wb_result pro čtení LOBu, nebo funkci wb_fetch_into pro přečtení dalšího záznamu do PHP proměnné typu pole. Daný LOB (hodnota proměnné délky v určitém sloupci a v určitém záznamu v otevřeném kurzoru) lze otevřít libovolněkrát, přitom všechny LOB resource handles vytvořené pro manipulaci s daným LOBem mají přístup k aktuální hodnotě LOBu (např. když pomocí jednoho handle přepíšeme určitý úsek v LOBu, tak okamžitě poté přečteme pomocí druhého handle změněný úsek ve změněné podobě). Operace s LOBy prováděné skrz LOB resource handles lze rollbackovat (tj. pokud jsou operace součástí databázové transakce, pak se při rollbacku této transakce tyto operace odvolají). Otevřený LOB resource handle může být uzavřen zavoláním funkce wb_close. LOBy, které budou otevřeny na konci zpracování požadavku, budou automaticky uzavřeny (není nutno volat funkci wb_close). Kurzor, ze kterého byly otevřeny nějaké LOBy, nemůže být explicitně uzavřen, dokud je jakýkoliv "jeho" LOB otevřený.

Další informace o tomto módu práce s LOBy naleznete v popisech funkcí, které s takto otevřenými LOBy manipulují. Zjištění aktuálního módu práce s LOBy platného pro daný otevřený kurzor provádí funkce wb_get_lob_mode, nastavení nového módu práce s LOBy pro daný kurzor funkce wb_set_lob_mode, čtení úseku hodnoty LOBu provádí funkce wb_lob_read, zápis (přepis) úseku hodnoty LOBu funkce wb_lob_write, zjištění aktuální velikosti hodnoty LOBu se provede funkcí wb_lob_length a změna velikosti (zkrácení) hodnoty LOBu funkcí wb_lob_truncate.

Seznam subsekcí: