Введение

Эти функции позволяют вам работать с Oracle версий 10/9/8/7. Для этого используется библиотека Oracle Call Interface (OCI).

Данный модуль много гибче прежнего. Он содержит функции привязки переменных PHP к соответствующим меткам Oracle, расширенную поддержка LOB, FILE и ROWID. Использование этого модуля рекомендуется вместо старого модуля.

Требования

Вам понадобятся клиентские библиотеки Oracle для того, чтобы использовать этот модуль. Пользователям Windows будут необходимы библиотеки минимум версии 10 для того, чтобы использовать php_oci8.dll.

Мы рекомендуем вам использовать Oracle Instant Client, доступный по адресу » http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html. Для использования модуля OCI8 достаточно установить "basic" версию пакета Oracle Instant Client. Instant Client не требует установки переменных ORACLE_SID или ORACLE_HOME. Однако, вам возможно понадобится установить переменные окружения LD_LIBRARY_PATH и NLS_LANG.

Перед использованием этого модуля, проверьте, что вы установили все необходимые переменные окружения. Эти переменные, перечисленные ниже, должны быть доступны пользователю Oracle и пользователю, с правами которого работает веб-сервер. Переменные окружения, необходимые для корректной работы с Oracle:

  • ORACLE_HOME
  • ORACLE_SID
  • LD_PRELOAD
  • LD_LIBRARY_PATH
  • NLS_LANG
  • ORA_NLS33

После установки среды окружения для веб-сервера, добавьте пользователя, с правами которого работает веб-сервер, в группу oracle.

Если ваш веб-сервер не стартует или возвращает ошибку при старте: Проверьте, что Apache был слинкован с библиотекой pthread:

# ldd /www/apache/bin/httpd 
libpthread.so.0 => /lib/libpthread.so.0 (0x4001c000)
libm.so.6 => /lib/libm.so.6 (0x4002f000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x4004c000)
libdl.so.2 => /lib/libdl.so.2 (0x4007a000)
libc.so.6 => /lib/libc.so.6 (0x4007e000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Если libpthread не присутствует в списке, то вам придется переустановить Apache:

# cd /usr/src/apache_1.3.xx
# make clean
# LIBS=-lpthread ./config.status
# make
# make install

Обратите внимание на то, что на некоторых системах, например, UnixWare, вместо libthread присутствует libpthread. PHP и Apache также должны быть собраны с EXTRA_LIBS=-lthread.

Установка

PHP должен быть сконфигурирован с опцией --with-oci8[=DIR], где DIR соответствует директории, в которой находится установленный ранее сервер и/или клиент Oracle. По умолчанию значение DIR соответствует переменной окружения ORACLE_HOME.

Если вы используете Oracle Instant Client, то для поддержки модуля OCI8 нужно, чтобы PHP был сконфигурирован с опцией --with-oci8-instant-client[=DIR]. Обратите внимание: поддержка Oracle Instant Client появилась только начиная с версий 4.3.11 и 5.0.4.

Настройка во время выполнения

Данное расширение не определяет никакие директивы конфигурации в php.ini.

Типы ресурсов

Предопределенные константы

Перечисленные ниже константы определены данным расширением и могут быть доступны только в том случае, если PHP был собран с поддержкой этого расширения или же в том случае, если данное расширение подгружается во время выполнения.

OCI_DEFAULT (integer)
Режим выполнения выражения SQL. В этом режиме транзакция не завершается автоматически оператором COMMIT.
OCI_DESCRIBE_ONLY (integer)
Режим выполнения выражения SQL. Используйте этот режим, если вы хотите получить данные о выполнении запроса, а не выполнить сам запрос.
OCI_COMMIT_ON_SUCCESS (integer)
Режим выполнения выражения SQL. Транзакция автоматически завершается вызовом оператора COMMIT после выполнения oci_execute().
OCI_EXACT_FETCH (integer)
Режим получения результатов запроса. Используется в том случае, если приложению известно заранее сколько строк будет получено в результате. Oracle 8 и более поздние версии не используют выборку результатов с упреждением в этом режиме, а курсоры уничтожаются автоматически после выборки ожидаемого количества строк, что может уменьшить требования сервера к ресурсам.
OCI_SYSDATE (integer)
OCI_B_BFILE (integer)
Используется функцией oci_bind_by_name() для привязки переменных типа BFILE.
OCI_B_CFILEE (integer)
Используется функцией oci_bind_by_name() для привязки переменных типа CFILE.
OCI_B_CLOB (integer)
Используется функцией oci_bind_by_name() для привязки переменных типа CLOB.
OCI_B_BLOB (integer)
Используется функцией oci_bind_by_name() для привязки переменных типа BLOB.
OCI_B_ROWID (integer)
Используется функцией oci_bind_by_name() для привязки переменных типа ROWID.
OCI_B_CURSOR (integer)
Используется функцией oci_bind_by_name() для привязки курсоров, созданных ранее с помощью oci_new_cursor().
OCI_B_NTY (integer)
Используется функцией oci_bind_by_name() для привязки именованных типов данных. В PHP < 5.0 эта константа называлась OCI_B_SQLT_NTY.
OCI_B_BIN (integer)
SQLT_BFILEE (integer)
То же, что и OCI_B_BFILE.
SQLT_CFILEE (integer)
То же, что и OCI_B_CFILEE.
SQLT_CLOB (integer)
То же, что и OCI_B_CLOB.
SQLT_BLOB (integer)
То же, что и OCI_B_BLOB.
SQLT_RDD (integer)
То же, что и OCI_B_ROWID.
SQLT_NTY (integer)
То же, что и OCI_B_NTY.
OCI_FETCHSTATEMENT_BY_COLUMN (integer)
Режим oci_fetch_all() по умолчанию.
OCI_FETCHSTATEMENT_BY_ROW (integer)
Альтернативный режим oci_fetch_all().
OCI_ASSOC (integer)
Используется с oci_fetch_all() и oci_fetch_array() для получения ассоциативного массива.
OCI_NUM (integer)
Используется с oci_fetch_all() и oci_fetch_array() для получения массива с числовыми индексами.
OCI_BOTH (integer)
Используется с oci_fetch_all() и oci_fetch_array() для получения массива с ассоциативными и числовыми индексами.
OCI_RETURN_NULLS (integer)
Используется с oci_fetch_array() для получения пустых элементов массива, если соответствующее поле в результате равно NULL.
OCI_RETURN_LOBS (integer)
Используется oci_fetch_array() для получения содержания объекта LOB вместо дескриптора.
OCI_DTYPE_FILE (integer)
Флаг используется oci_new_descriptor() для инициализации дескриптора типа FILE.
OCI_DTYPE_LOB (integer)
Флаг используется oci_new_descriptor() для инициализации дескриптора типа LOB.
OCI_DTYPE_ROWID (integer)
Флаг используется oci_new_descriptor() для инициализации дескриптора типа ROWID.
OCI_D_FILE (integer)
То же, что и OCI_DTYPE_FILE.
OCI_D_LOB (integer)
То же, что и OCI_DTYPE_LOB.
OCI_D_ROWID (integer)
То же, что и OCI_DTYPE_ROWID.

Примеры

Примеры использования

?php
// by sergo at bacup dot ru

// Use option: OCI_DEFAULT for execute command to delay execution
OCIExecute($stmt, OCI_DEFAULT);

// for retrieve data use (after fetch):

$result = OCIResult($stmt, $n);
if (
is_object($result)) $result = $result->load();

// For INSERT or UPDATE statement use:

$sql = "insert into table (field1, field2) values (field1 = 'value',
field2 = empty_clob()) returning field2 into :field2"
;
OCIParse($conn, $sql);
$clob = OCINewDescriptor($conn, OCI_D_LOB);
OCIBindByName($stmt, ":field2", &$clob, -1, OCI_B_CLOB);
OCIExecute($stmt, OCI_DEFAULT);
$clob->save("some text");
OCICommit($conn);

?>

Вы можете использовать хранимые процедуры так же, как это делается из командной строки.

Использование хранимых процедур

?php
// by webmaster at remoterealty dot com
$sth = OCIParse($dbh, "begin sp_newaddress( :address_id, '$firstname',
'$lastname', '$company', '$address1', '$address2', '$city', '$state',
'$postalcode', '$country', :error_code );end;"
);

// This calls stored procedure sp_newaddress, with :address_id being an
// in/out variable and :error_code being an out variable.
// Then you do the binding:

OCIBindByName($sth, ":address_id", $addr_id, 10);
OCIBindByName($sth, ":error_code", $errorcode, 10);
OCIExecute($sth);

?>