Информационные технологииStfw.Ru 🔍

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.

Аргументом можно указать дескриптор, для которого получается сообщение.

Учебник по основам PHP   Теги:

Читать IT-новости в Telegram

Читайте также:

Oracle

Информационные технологии
Мы в соцсетях ✉