K práci s LOBy se v OCI používají proměnné typu OCILobLocator reprezentující lokátory LOBů.
Tyto lokátory jsou používány všemi funkcemi, které pracují s LOBy.
Chceme-li s LOBem pracovat, je třeba alokovat jeho lokátor a inicializovat ho.
Pro lokátor je třeba alokovat paměť funkcí OCIDescriptorAlloc, které předáme jako typ deskriptoru
konstantu OCI_DTYPE_FILE (externí LOB) nebo OCI_DTYPE_LOB (interní LOB) - tyto lokátory nelze zaměňovat, ačkoliv
jsou v C stejného typu.
OCIDescriptorAlloc(*environment,*lob,type,size,...)OCIDescriptorFree(*locator,*type)OCIDescriptorAlloc();
OCIStmtPrepare("SELECT lob FROM table FOR UPDATE");
OCIDefineByPos();
OCIStmtExecute(...,mode = OCI_DEFAULT);
OCICommit();
OCIDescriptorAlloc();
OCIStmtPrepare("INSERT INTO table(LOB) VALUES(EMPTY_CLOB()) RETURNING LOB INTO :lob ");
OCIBindByPos() nebo OCIBindByName();
OCIStmtExecute(...,mode = OCI_DEFAULT);
OCICommit();
OCIAttrSet() nastavit jeho atribut OCI_ATTR_LOBEMPTY, čímž dostaneme prázdný LOB,
který může být použit pouze pro vložení do nějaké tabulky (UPDATE ... SET lob nebo
INSERT ... VALUES(lob, ...))
Když máme alokován interní LOB, lze z něj číst a zapisovat do něj. Do externího LOBu nelze přes OCI zapisovat.
OCILobRead(...,*lob,*buffer,buffer_length,offset,callback,...)OCILobWrite(...)OCILobWriteAppend(...)OCILobWrite.OCILobGetLength(...,*lob,*length)OCILobAppend(...,*src_lob,*dst_lob),OCILobCopy(...,*src_lob,*dst_lob,amount,src_offset,dst_offset),OCILobErase(...,*lob,amount,offset),OCILobTrim(...,*lob,new_length),OCILobFileOpen(...,*lob,OCI_FILE_READONLY)OCILobFileClose(...,*lob)OCILobFileGetName(...,*lob,*directory_alias,*alias_length,*file_name,*name_length)OCILobFileSetName(...,*lob,*directory_alias,*alias_length,*file_name,*name_length)OCILobFileIsOpen(...,*lob,*is_open)OCILobFileExists(...,*lob,*is_exists)Každý LOB na serveru může je buď otevřený nebo uzavřený.
Je-li s uzavřeným LOBem manipulováno, automaticky se otevře, provede se požadovaná operace a po skončení této operace
se uzavře. Po uzavření LOBu se provedou triggery, jsou-li nějaké definovány.
Sérii úprav LOBu lze obklopit funkcemi pro otevření a uzavření LOBu tak, aby se během těchto úprav nevyvolávaly triggery.
OCILobOpen(...,*lob,mode),OCILobOpen() používaná pro externí LOBy.
OCILobClose(...,*lob),OCILobClose() používaná pro externí LOBy.
OCILobIsOpen(...,*lob,mode),Při práci s interními LOBy lze zvýšit výkon aplikace, které provádí mnoho čtení nebo zápisů krátkých úseků LOBů.
Dosáhneme toho zapnutím bufferování na straně klienta.
OCILobEnableBuffering(...,*lob),OCILobDisableBuffering(...,*lob),OCILobFlushBuffer(...,*lob),OCILobAppend(),
OCILobCopy(),
OCILobErase(),
OCILobGetLength(),
OCILobLoadFromFile(),
OCILobTrim(),
OCILobWriteAppend()Dočasné LOBy mají data uložena na serveru, avšak lokátor mají pouze u klienta.
Jejich životnost je omezena obvykle po dobu trvání session, lze ale nastavit jinak.
Na dočasný LOB je možné aplikovat funkce používané pro standardní LOBy.
Používají se jako lokální pomocné proměnné.
OCILobCreateTemporary(...,*lob,type,cache,duration),OCILobFreeTemporary(...,*lob),OCILobIsTemporary(...,*lob),OciLogon(user,password,connection_string)
| Přihlásí se k databázi. |
OciLogoff(connection)
| Odhlásí se od databáze (automaticky po ukončení skriptu). |
OciParse(connection,SQL)
| Vrací statement jako identifikátor zpracovaného výrazu na serveru. |
OciExecute(statement[,mode])
| Vykoná na serveru rozparsovaný výraz statement. Transakce je automaticky potvrzena, pokud není uveden mod OCI_DEFAULT. |
OciCommit(connection)
| Potvrdí probíhající transakci. |
OciRollback(connection)
| Zruší probíhající transakci. |
OciFetch(statement)
| Do interního bufferu PHP vloží jednu řádku z výsledku (sekvenčně). |
OciResult(statement,column_name)
| Z řádku uloženém v interním bufferu vybere hodnotu v zadaném sloupci. |
OciBindByName(statement,sql_var,variable,length[,type])
| Vytvoří vazbu proměnné PHP variable na zástupnou proměnnou v SQL sql_var. Pokud je proměnná LOB, musí být specifikován typ: OCI_B_FILE, OCI_B_CFILE, OCI_B_CLOB nebo OCI_B_BLOB. Délka dat v proměnné nesmí přesáhnout length, u LOBů se nepoužívá. |
OciNewDescriptor(connection,type)
| Alokuje a vrací lokátor externího (type = OCI_D_FILE) nebo interního (OCI_D_LOB) LOBu. |
OciFreeDesc(locator)
| Zruší lokátor a uvolní paměť. |
OciNewDescriptor, je objekt, který má pro interní LOBy tři metody:
<?php/* Prihlaseni k databazi ************************************************/ $connection = OciLogon("scott","tiger","DB"); /* Vytvoreni tabulky ****************************************************/ $statement = OciParse($connection,"CREATE TABLE Tab(Jmeno VARCHAR(20), Data CLOB)"); @OciExecute($statement); OciFreeStatement($statement); /* Ulozeni LOBu do tabulky **********************************************/ $statement = OciParse($connection,"INSERT INTO Tab(Jmeno,Data) VALUES('lob.txt',EMPTY_CLOB()) RETURNING Data INTO :lob"); //Pripojeni lokatoru LOBu: $locator = OciNewDescriptor($connection,OCI_D_LOB); OciBindByName($statement,":LOB",&$locator,-1,OCI_B_CLOB); OciExecute($statement,OCI_DEFAULT); //Nacteni LOBu ze souboru: $locator->SaveFile("lob.txt"); OciCommit($connection); OciFreeStatement($statement); /* Nacteni LOBu z tabulky ***********************************************/ $statement = OciParse($connection,"SELECT Jmeno,Data FROM Tab"); OciExecute($statement,OCI_DEFAULT); while (OciFetch($statement)) { $lob = OciResult($statement,"DATA"); echo $lob->Load()."<BR>"; } OciCommit($connection); OciFreeStatement($statement);?>