Руководство по PHP
Пред. |  | След.

# CIII. Функции для работы с Oracle

# Введение

Эти функции позволяют вам работать с 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`.

# Примеры

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

`<?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);
?>`

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

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

`<?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);
?>`

Пред. | Начало | След.
overload | Уровень выше | OCI-Collection->append