Oracle 8
Взаимодействие с базами данных
🕛 01.11.2006, 14:01
Эта группа функций позволяет обращаться к серверам БД Oracle 8 и Oracle 7, используя Oracle 8 Call-Interface (OCI8). Для этого требуются клиентские библиотеки Oracle 8. Это расширение более функционально, нежели стандартное; оно поддерживает связывание переменных РНР с переменными Oracle, имеет полную поддержку типов LOB, FILE, ROWID и позволяет использовать определяемые пользователем переменные.
До использования этого расширения необходимо установить параметры окружения Oracle. Это включает установку следующих системных переменных:
ORACLEJOME;
ORACLEJID;
LD_PRELOAD;
LD_LIBRARY_PATH;
NLS_LANG;
ORAJLS33.
После этого необходимо добавить в группу пользователей oracle пользователя (обычно nobody или www), от имени которого запускается РНР (web-сервер).
OCIServerVersion
Получение строки информации сервера
string OCIServerVersion (int conn)
<?php
$conn = OCILogonC'scott"."tiger");
print "Server Version "
. OCIServerVersionUconn):
OCILogOff($conn): ?>
OCILogon
Подключение к серверу Oracle
int OCILogon (string username, string password [, string db])
Возвращает дескриптор подключения, необходимый для указания для большинства функций OCI. В третьем аргументе можно указать либо константное имя локальной БД, либо ссылку на раздел в файле tnsnames.ora; если этот аргумент не указан, РНР будет использовать переменные окружения ORACLE_SID или TWO_TASK (tnsnames. ога) для определения, к какой БД следует подключиться.
Подключения, созданные этой функцией, становятся разделяемыми на уровне сценария, что означает, что все команды COMMIT и ROLLBACK будут применяться ко всем транзакциям, даже если они принадлежат разным подключениям (см. пример ниже).
См. также: OCIPLogonz() и OCINLogon().
OCINLogon
Создание изолированного подключения к БД Oracle
int OCINLogon (string username, string password [, string db])
Функция сходна с OCILogon(), но отличается тем, что все onepai COMMIT и ROLLBACK применяются только к транзакциям укаг ною подключения.
Пример демонстрирует разделение подключений.
<?php $db = "":
$cl = ocilogonC'scott". "tiger". $db):
/'$c2 = ocilogonC'scott"."tiger".$db);
// для сравнения
$c2 = ocinlogonC'scott". "tiger".$db):
function create_table(Sconn)
{ Sstmt = ociparse($conn.
"create table scott hallo (test
varchar2(64))");
ociexecutetSstmt):
echo Sconn." Таблица создана \n\n". , }
function drop_table($conn)
{ Sstmt = ociparse($conn."drop
table scott hallo"):
ociexecute($stmt).
echo Sconn." dropped table\n\n": ! }
function insert_data(Sconn)
{ Sstmt = ociparse(Sconn."insert
into scott.hallo
valuest'Sconn' [j ' ' | to_char
(sysdate. 'DD-MON-YY HH24:MI:SS'))"):
ocie/ecute(Sstmt.OCI_DEFAULT).
echo Sconn." inserted hallo\n\n": }
function delete_data(Sconn)
{ Sstmt = ociparse
(Sconn."delete from scott.hallo");
ociexecute(Sstmt.OCI_DEFAULT);
echo Sconn." deleted hallo\n\n"; }
function commit(Sconn)
{ ocicommit(Sconn);
echo Sconn." committed\n\n": }
function roll back(Sconn)
{ ociroll back(Sconn):
echo Sconn " rollback\n\n"; }
function select_data($conn)
{ Sstmt = ociparse
($conn."select * from scott.hallo"):
ociexecute($stmt.OCI_DEFAULT).
echo $conn."-selecting\n\n";
while (ocifetch($stmt))
echo Sconn." <".ociresult
(Sstmt."TEST").">\n\n":
echo Sconn "-done\n\n"; }
create_table($cl); insert_data($cl):
selectjJata(tcl): select_data($c2):
roliback(Scl):
select_data($cl). select_data($c2):
insert_data($c2): согап t($c2);
select_data($cl).
delete_data($cl): select_data($cl):
select_data($c2). commit($cl):
select_data(Scl): select_data($c2).
drop_table($cl): ?>
См. также: OCILogon() и OCIPLogon().
OCILogOff
Отключение от Oracle
int OCILogOff (int connection)
OCIPLogon
Создание устойчивого подключения к Oracle
int OCIPLogon (string username, string password [, string db])
Функция сходна с OCILogon(), но отличается тем, что подключение не закрывается после завершения сценария и остается действительным для дальнейшего использования.
См. также: OCILogon() и OCINLogon().
OCIInternalDebug
Разрешение или запрещение внутренней отладки void OCIInternalDebug (int onoff)
По умолчанию отладка запрещена. Указание в аргументе значения О выключает отладку, а 1 - включает.
OCIDefineByName
Назначение PHP-переменной для возвращения значения из запроса SELECT
int OCIDefineByName (int stmt, string ColumnName, mixed variable [, int type])
Используется при необходимости возвращения запросом выборки stmt данных поля ColumnName в переменную variable (тип возвращаемых данных type можно не указывать). Имя поля должно быть указано в верхнем регистре (в запросе регистр не важен). Если вы определяете переменную, отсутствующую в запросе, ошибки не возникает.
Типы абстрактных данных (LOB/ROWID/BFILE) необходимо предварительно инициализировать функцией OCINewDescriptor().
См. также OCIBindByName().
<?php
Sconn = OCILogonC'scott". "tiger"),
Istmt = OCIParse($conn."select empno.
ename from emp"): /* the define
MUST be done BEFORE odexecute! */
OCIDefineByNametSstmt."EMPNO",Sempno);
OCIDefineByNametSstmt."ENAME".Sename):
OCIExecute($stmt):
while (OCIFetch(Sstmt))
echo "empno:".$empno.". ename:".Sename."\n";
OCIFreeStatement($stmt):
OCILogoff(Sconn): ?>
OCIBindByName
Связывание переменной РНР с Oracle
int OCIBindByName (int stmt, string ph_name, mixed invariable, int length [, int type])
Назначает переменную PHP variable для ввода-вывода данных ир операциях с Oracle в качестве параметра phjiame. Аргумент length устанавливает размер данных переменной в байтах; значение -1 указывает, что размер определяется автоматически.
Для операций с абстрактными типами (LOB/ROWID/BFILE) прел варитслыю необходимо инициализировать их дескриптор функци ей OCINewDescriptorO. Для этих типов размер length должен быт указан значением -1. Тип type может определяться следующим константами: OCI_B_FILE (двоичный файл), OCI_B_CFILE (символьны файл), OCI_B_CLOB (символьный LOB), OCI_B_BLOB (двоичный LOB) OCI_B_ROWIO (ROWID).
<?php
$sth - OCIParse ( $dbh. "begin
sp_newaddress( -addressjd.
'Sfirstname'.
'Slastname'. 'Scompany'. '$addressl'.
'$address2'. 'Scity'. 'Sstate'.
'$postalcode'. 'Scouniry'. :error_code );
end;" ).
// Вызвать хранимую процедуру
spjiewaddress.
с параметрами :address_id //
(.входной-выходной параметр) и
:error_code being <выходной).
OCIBindByName ( $$th. " :address_id".
Saddrjd. 10 ): OCIBindByName
( $sth. " :error_code". Serrorcode. 10 );
OCIExecute ( $sth ): ?>
/y**********Jc*********************x*********
<?php Sconn - OCILogonC'scott"."tiger"),
Sstmt = OCIParse($conn."insert into enp
(empno. ename) ".
"values (:empno,:ename!
1 returning ROWID into :nd"):
Sdata = arraydlll =>
"Lar-y" 2222 => "Bill". 3333 => "Jim"),
Srowid = OCINewDescnptor
($conn.OCI_D_ROWID);
ОС IBindByName(Istmt.":empno"
.&$empno.32). OCIBipdByName
($stmt."-ename".&$ename.32),
OCIBindByNametS
stmt.":rid".&$rowid.-1.0CI_B_ROWID):
Supdate = OCIParse($conn.
"update emp set sal = :sal where
ROWID = :nd"): OCIBmdByNaTO
($Update.":nd".&$rowid.-1.0CI_6_ROWID).
OCIBindBy
Namecsupdate.":sal",&$sal.32)
$sal - 10000.
while nist($enpno..$enarae)
= each($data)) { OCIExecute
($stmt). OCIExecute($Update);
$rowid->free(> OCIFreeStatement
($update): OC!FrepStatement($stmt).
$stmt = OCIParSe($conn."select *
from emp
where empno in
(1111.2222,3333)"):
OCIExecute($stmt);
while (OCIFetchInto
($stmt.&$arr.OCI_ASSOC))*
var_dump($grr).
OCIFreeStatement($stmt).
Sstmt - OCIParse($conn.
"delete from emp
where empno in (1111.2222.3333)");
OCIExecute($stmt).
OCIFreeStatement($stmt):
OCIlogoff($conn) ?>
OCI Parse
Подготовка запроса к выполнению
int OCIParse (jnt conn, strint query)
Возвращает дескриптор запроса query для подключения conn или FALSE - при ошибке.
OCIExecute
Выполнение запроса
int OCIExecute (int statement [, int mode])
Выполняет счапрос, предварительно подготовленный OCIParseO. Аргументом mode можно указать режим исполнения (по умолчанию OCI_COMMIT_Olsj_sUCCESS); если не требуется автоматическое выполнение запроса, указывайте OCI_DEFAULT.
OCICommit
Завершение незавершенных транзакций
int OCICommit (int connection)
OCIRollback
Отмена незавершенных транзакций
int OCIRollback (int connection)
OCINewDescriptor
Инициализация дескриптора LOB/FILE
string OCINewDescriptor (int connection [, int type])
Выделяет ресурсы, необходимые для хранения дескрипторов или LOB-локаторов. Тип можно указать в аргументе type: OCI_D_FILE, OCI_DJ_OB (по умолчанию), OCI_D_ROWID. Для объектов LOB доступны методы load, save и savefile, а для BFILE - только load.
<?php // фрагмент for retrieve
data use (after fetch)
Sresult = OCIResult($stmt, $n):
if ds_object (Sresult))
Sresult = Sresult->load():
II For INSERT or UPDATE
statement use
$sql = "insert into table (fieldl. field2)
values (fieldl = 'value'.
field? = empty_clob()) returning
fie!d2 into :field2"; OC!Parse
($conn. $sql): Sclob =
OCINewDescriptor($conn. OCIJM-OB).
OCIBindByName
($stmt. ":field2". &$clob. -1,
OCI_B_CL03). OCIExecute
($stmt. OCI_DEFAULT):
$clob->save ("some text"). ?>
<?php // Сценарий вызывается
формой HTML, передавая
параметры:
// $user. Spassword,
$ table. $where. и Scommitsize
$conn = OCILogon($user. Spassword);
$stmt = OCIParsetSconn.
"select rowid from Stable $v.here"):
Srowid = OCINewDescnptor
(sconn.OCI_D_ROWID);
OCIOefineB>Name($stmt.
"ROUID",&$rowid); ОС I
Execute(Sstmt). while
( OClFetch(Sstmt) ) {
$nrows = OCIRowCount(Sstmt);
Sdelete = OCIParsetSconn."delete
from Stable where ROWID - rid").
OCIBindByName
(Sdelete."-nd" &$rowid.-1.0CI_B_ROWID);
OCIExecute($deletei. print "$nrows\n",
if ( ($nrows % Scommitsize) == 0 )
{ OCIComirnt($conn). } }
Snrows = OCIRowCountC$stmt):
print "Snrows удалено . \n":
OCIFreeStatement(Sstmt); OClLogoff($conn): ?>
<?php /* Сценарий загружает файл в поле LOB */
if(Msset($lobjjpload) || $lob_upload ^= 'none'){ ?>
<form action="upload bhp" method="post"
enctype="multipart/form-data">
Upload file- <input type="file" name=
"lob_upload"><br> <input type="submit"
value="Upload"> - <inpwt type="reset">
</form> <?php } else {
// $lob_upload contains the temporary
filename of the uploaded file $conn =
OCILogon($user. Spassword); , Slob =
OCINewDescnptor($conn. OCI_D_Li)B).
Sstmt OCIParseCSconn."insert into
Stable (id. the_blob) values
(my_seq.NEXTVAL. HMPTY_BLOB(> )
returnina thp_hlob into the_blob"),
OCIBindByNarnpCSstmt. ':tne_blob',
&Slob. -1. OCIJJLOB); OCIExecuteCSsiirtt;;
1f($lob->savefi1e($lob_up1oad))
{ ОС 'ommit(Sconn);
echo "Blob successfully uploaded\n"; }else{
echo "Couldn't upload Blob\n"; }
OCIFreeDesc(Slob); OCIFreeStatement
(Sstmt): OClLogoff($conn): } ?>
OCIRowCount
Получение числа измененных записей int OCIRowCount (int statement)
Возвращается число записей, измененных запросом (например, UPDATE). Функция не возвращает число возвращенных запросом записей!
<?php $conn = OCILogonC'scott"."tiger"):
Sstmt = OCIParsetSconn,"create table
emp2 as select * from emp");
OCIExecute($stmt).
print OCIRowCount(Sstmt) .
" записей добавлено.<BR>":
OCIFreeStatement($stmt).
$stmt = OCIParse($conn."delete from emp2").
ОС I Execute(Sstmt),
print OCIRowCount(Sstmt) " записей удалено <BR>".
OCICommit(Sconn). OCIFreeStatementOstmt);
Sstmt = OCIParsetSconn."drop table emp2").
OCIExecute(Sstmt). OCIFreeStatement($stmt):
OCILogOff($conn). ?>
OCINumCols
Получение числа полей в запросе
int OCINumCols (int stmt)
<?php Sconn = OCILogonC'scott". "tiger");
Sstmt = OCIParse($conn."select * from emp"):
OCIExecutetSstmt): while ( OCIFetch($stmt) )
{ Sncols = OCINumColstSstmt); for
( $1 = 1; $i <= Sncols; $i++ ) {
Jcolumnjiame = OCIColumnName(Sstmt.$1):
Scolumn_value = OCIResultCSstmt.SD;
print $column_name .':', Scolumn_value . "\n"; )
print "\n"; } OCIFreeStatemenUSstrnt):
OCILogoff(Sconn): ?>
OCIResult
Получение значения поля записи, возвращенной запросом
mixed OCIResult (int statement, mixed column)
Возвращает данные ноля column текущей записи (см. OCIFetch()). Возвращает все типы данных как строки, за исключением абстрактных типов (ROWID, LOB и FILE).
OCIFetch
Занесение следующей возвращенной записи в буфер результата int OCIFetch (int statement)
Позволяет получить запись после запроса выборки (SELECT) с помощью последующих вызовов OCIResultO, возвращающих поля записи.
OCIFetchlnto
Занесение следующей записи в массив
Int OCIFetchlnto (int stmt, array Sresult [, int mode])
Функция позволяет поочередно получить все записи, возвращенные запросом выборки. По умолчанию массив result будет содержать все поля записи (содержащие данные, не равные NULL) с нумерацией начиная с 1.
Аргумент mode позволяет изменить действие функции. Константы могут комбинироваться сложением (например, OCI_ASSOC+OCI_RETURN_NULLS):
OCI_ASSOC - возвращать ассоциативный массив;
OCI_NUM - возвращать нумерованный массив (по умолчанию);
OCI_RETURN_NULLS - возвращать пустые поля;
OCI_RETURN_LOBS - возвращать содержимое полей LOB вместо их дескриптора.
OCIFetchStatement
Занесение результата запроса в массив
int OCIFetchStatement (int stmt, array Svariable)
Возвращает число записей, занесенных в массив variable.
<?php Sconn = OCILogonC'scott"."tiger"):
$stmt = OCIParse($conn,"select * from emp");
OCIExecute($stmt).
Snrows = OCIFetchStatement($stmt,$results);
if ( Snrows > 0 ) {
print "<TABLE BORDER=\"l\"><TR>\n";
while ( list($key. $val) = each($results) )
print "<TH>$key</TH>\n":
print "</TR>\n";
for ( $1 = 0. $1 < Snrows; $i++ )
{ print "<TR>\n"; reset($results);
while ( $column = each($results) )
{ $data = $columr>['value'] [$i];
print "<TD>$data</TD>\n"; }
print "</TR>\n":
print "</TABLE>\n": }
print "Получено Snrows записей <BR>\n";
OCIFreeStatement($stmt);
OCILogoff($conn): ?>
OCIColumnlsNULL
Проверка, содержит ли поле записи значение NULL
int OCIColumnlsNULL (Int stmt, mixed column)
Возвращает TRUE, если ноле column в результате запроса strat имеет значение NULL. Поле может указываться номером (начиная с 1) или именем.
OCIColumnName
Получение имени поля
string OCIColumnName (int stmt, int col)
<?php Sconn OCILogonC'scott". "tiger").
Snmt = OCIParse($conn."select * from emp");
ОС I Execute(Sstmt):
print "<TABLE BORDER=\"l\">
<TR><TH>Name</TH><TH>Type</TH>".
"<TH>Length</TH></TR>":
Srcols = OCINumCols($stmt): for
( $1 = 1. $1 <= $ncols>: $i++ ) { .
$column_name = OCIColumnNarae($stmt,$i);
$column_type = OCIColuranTypef$stmt.$i):
$column_size = OCIColumnSize($stmt.$i).
print "<TR><TD>$column_name</TD>
<TD>$column_type</TD>":
pn nt "<TD>$column_size</TD></TR>"; }
OCIFreeStatement($stmt):
OCILogofftSconn). ?>
См. также: OCINumCols(), OCIColumnType() и OCIColumnSize().
OCIColumnSize
Получение размера поля
int OCIColumnSize (Int stmt. mixed column)
См. также: OCINumCols(), OCIColumnName() и OCIColumnSize().
OCIColumnType
Получение типа поля
mixed OCIColumnType (int stmt, int col)
См. также: OCINumCols(), OCIColumnName() и OCIColumnSize().
OCIStatementType
Получение типа ОСI запроса
string OCIStatementType (int stmt)
Возвращает одно из следующих значений:
«SELECT»;
«UPDATE»;
«DELETE»;
«INSERT»;
«CREATE»;
«DROP»;
«ALTER»;
«BEGIN»;
«DECLARE»;
«UNKNOWN».
<?php
$conn = OCILogonC'scott"."tiger"):
$sql = "delete from emp where deptno = 10":
$stmt = OCIParse{$conn.$sql).
if ( OCIStatementType($stmt) == "DELETE" ) {
die "Вам не разрешено удалять записи этой таблицы"; }
OCII.ogoff($conn): ?>
OCINewCursor
Получение нового курсора (дескриптора запроса)
int OCINewCursor (int conn)
Используется для связывания ссылочных курсоров.
<?php // хранимая процедура info.output возвращает ref cursor в :data
Sconn = OCILogonC'scott". "tiger").
Scurs = OCINewCursor(Sconn);
Sstmt - OC!Parse($conn,"begin info.output(:data); end;");
ocibindbyname($stmt."data".&$curs.-1.0CI_B_CURSOR);
ociexecute(lstmt): ociexecute(Scurs);
while (OCIFetchInto($curs.&$data)) { var_dump($data); }
OCIFreeCursor(Sstmt); OClFreeStatement($curs);
OCILogoff($conn); ?>
<?prp // Example 2. REF CURSOR в запросе select
Sconn = OCILogonC'scott"."tiger").
$count_cursor = "CURSOR(select count(empno) num_emps from emp "
"where emp.deptno = dept.deptno)
as EMPCNT from dept"; Sstmt = OCIParse
(Sconn."select deptno.dname.Scount_cursor").
ociexecutetSstmt);
print "<TABLE BORDER=\"1\">
<TR><TH>DEPT NAHE</TH>";
print "<TH>DEPT #</TH><TH># EMPLOYEES</TH></TR>";
while (OC!FetchInto(Sstmt,&$data.OCI_ASSOO)
{ print "<TR>". Sdname = $data["DNAME"].
Sdcptno = Sdata["DEPTNO"]; print "
<TD>Sdname</TD><TD>Sdeptno</TD>",
ooexecute($data[ "EMPCNT" ]);
while (OCIFetchIntoCSdata[ "EMPCNT" ]
.&$subdata.OCI_ASSOO)
{ $num_emps = Ssubdata["NUM_EMPS"];
print "<TD>$num_emps</TD>"; } print "</TR>";
print "</TABLE>"; OClFreeStatement(Sstmt);
OCILogoff(Sconn):
OCIFreeStatement
Освобождение ресурсов, занимаемых запросом
int OCIFreeStatement (int stmt)
Возвращает TRUE или FALSE - при ошибке.
OCIFreeCursor
Освобождение ресурсов курсора
Int OCIFreeCursor (int stmt)
Возвращает TRUE или FALSE - при ошибке.
OCIFreeDesc
Уничтожение дескриптора большого объекта
int OCIFreeDesc (object lob)
Возвращает TRUE или FALSE - при ошибке.
OCI Error
Получение последнего сообщения об ошибке
array OCIError ([int stmt|conn(global])
Возвращает ассоциативный массив, содержащий элементы code (номер ошибки) и message (сообщение ошибки). Если ошибки не про-> изошло, возвращает FALSE.
Аргументом можно указать дескриптор, для которого получается сообщение.