PHP Manual
后退 |  | 前进

# LXXXVIII. Oracle 8 函数库

# 简介

这些函数允许你访问 Oracle8 和 Oracle7 数据库。这些函数使用 Oracle8 Call-Interface (OCI8)。

该扩展比 Oracle 标准函数扩展更灵活。支持向 Oracle 位置标志符绑定局部和全局 PHP 变量，全面支持 LOB、FILE 和 ROWID，允许用户使用用户自定义的变量。

# 需求

使用这个扩展需要 Oracle8 客户端库。Windows 用户需要至少 Oracle 8.1 来使用 `php_oci8.dll`。

在使用这个扩展之前，请确认你已经为 Oracle 用户和 web daemon 用户正确设置了 Oracle 环境变量。下面列出了需要设置的环境变量：

- ORACLE_HOME

- ORACLE_SID

- LD_PRELOAD

- LD_LIBRARY_PATH

- NLS_LANG

- ORA_NLS33

在为 web 服务器用户设置环境变量之后，你还需要将 web 服务器用户(nobody、 www)加到 oracle 组中。

> 如果你的 web 服务器不能够启动或者在启动的时候崩溃: 检查 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 配置。

# 安装

Äã±ØÐëÊ¹ÓÃÑ¡Ïî --with-oracle[=DIR] ±àÒë PHP £¬ DIR µÄÄ¬ÈÏÖµÊÇ»·¾³±äÁ¿ ORACLE_HOME¡£

# 运行时配置

本扩展模块在 `php.ini` 中未定义任何设置指令。

# 资源类型

# 预定义常量

以下常量由本扩展模块定义，因此只有在本扩展模块被编译到 PHP 中，或者在运行时被动态加载后才有效。

`OCI_DEFAULT` (integer)

`OCI_DESCRIBE_ONLY` (integer)

`OCI_COMMIT_ON_SUCCESS` (integer)

`OCI_EXACT_FETCH` (integer)

`SQLT_BFILEE` (integer)

`SQLT_CFILEE` (integer)

`SQLT_CLOB` (integer)

`SQLT_BLOB` (integer)

`SQLT_RDD` (integer)

`OCI_B_SQLT_NTY` (integer)

`OCI_SYSDATE` (integer)

`OCI_B_BFILE` (integer)

`OCI_B_CFILEE` (integer)

`OCI_B_CLOB` (integer)

`OCI_B_BLOB` (integer)

`OCI_B_ROWID` (integer)

`OCI_B_CURSOR` (integer)

`OCI_B_BIN` (integer)

`OCI_FETCHSTATEMENT_BY_COLUMN` (integer)

`OCI_FETCHSTATEMENT_BY_ROW` (integer)

`OCI_ASSOC` (integer)

`OCI_NUM` (integer)

`OCI_BOTH` (integer)

`OCI_RETURN_NULLS` (integer)

`OCI_RETURN_LOBS` (integer)

`OCI_DTYPE_FILE` (integer)

`OCI_DTYPE_LOB` (integer)

`OCI_DTYPE_ROWID` (integer)

`OCI_D_FILE` (integer)

`OCI_D_LOB` (integer)

`OCI_D_ROWID` (integer)

# 例

例子 1. OCI 提示

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

后退 | 起点 | 前进
deaggregate | 上一级 | oci_bind_by_name