|
XCVIII. Oracle 函数
本类函数使用 Oracle Call
Interface(OCI)使用户可以访问 Oracle 10,Oracle9,Oracle8 和 Oracle7
数据库。支持将 PHP 变量与 Oracle 占位符(placeholder)绑定,具有完整的
LOB,FILE 和 ROWID 支持,以及允许使用用户提供的定义变量。
使用本扩展需要 Oracle 客户端库。Windows
用户需要至少 Oracle 8.1 版才能使用
php_oci8.dll。
安装所有所需文件最方便的方法是使用
Oracle Instant Client,可以从此处得到:http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html。Instant
Client 不需要 ORACLE_SID 或 ORACLE_HOME 环境变量被设定。不过可能还是要设定
LD_LIBRARY_PATH 和 NLS_LANG。
在使用本扩展之前,请确认已经为 Oracle 用户和 web daemon
用户正确设置了 Oracle 环境变量。这些变量应该在启动 web server
之前设定。下面列出了需要设置的环境变量:
ORACLE_HOME
ORACLE_SID
LD_PRELOAD
LD_LIBRARY_PATH
NLS_LANG
对于较少用到的 Oracle 环境变量例如
TNS_ADMIN,TWO_TASK,ORA_TZFILE 和各种 Oracle
全球性设定例如 ORA_NLS33,ORA_NLS10 和 NLS_*
等变量请参考 Oracle 稳当。
在为 web 服务器用户设置环境变量之后,还需要将 web
服务器用户(nobody,www)加到 oracle 组中。
I如果 web 服务器不能够启动或者在启动的时候崩溃:
检查 Apache 是否连接了 pthread 库:
如果 libpthread 没有列出,必需重新安装 Apache:
请注意在像 UnixWare 之类的某些操作系统中,使用 libthread
代替了 libpthread。则 PHP 和 Apache 必须使用 EXTRA_LIBS=-lthread 配置。
这些函数的行为受 php.ini 的影响。
表格 1. OCI8 Configuration Options Name | Default | Changeable | Changelog |
---|
oci8.privileged_connect | "0" | PHP_INI_SYSTEM | Became available in oci8 module version 1.1 | oci8.max_persistent | "-1" | PHP_INI_SYSTEM | Became available in oci8 module version 1.1 | oci8.persistent_timeout | "-1" | PHP_INI_SYSTEM | Became available in oci8 module version 1.1 | oci8.ping_interval | "60" | PHP_INI_SYSTEM | Became available in oci8 module version 1.1 | oci8.statement_cache_size | "20" | PHP_INI_SYSTEM | Became available in oci8 module version 1.1 | oci8.default_prefetch | "10" | PHP_INI_SYSTEM | Became available in oci8 module version 1.1 | oci8.old_oci_close_semantics | "0" | PHP_INI_SYSTEM | Became available in oci8 module version 1.1 |
以下是配置选项的简要解释。
- oci8.privileged_connect
boolean
This option enables privileged connections using external credentials
(OCI_SYSOPER, OCI_SYSDBA).
- oci8.max_persistent
int
The maximum number of persistent OCI8 connections per process.
Setting this option to -1 means that there is no limit.
- oci8.persistent_timeout
int
The maximum length of time (in seconds) that a given process is
allowed to maintain an idle persistent connection.
Setting this option to -1 means that idle persistent connections will
be maintained forever.
- oci8.ping_interval
int
The length of time (in seconds) that must pass before issuing a ping
during oci_pconnect(). When set to 0, persistent
connections will be pinged every time they are reused. To disable
pings completely, set this option to -1.
注:
Disabling pings will cause oci_pconnect() calls to operate at the
highest efficiency, but may cause PHP to not detect faulty connections,
such as those caused by network partitions, or if the Oracle server has
gone down since PHP connected, until later in the script. Consult the
oci_pconnect() documentation for more information.
- oci8.statement_cache_size
int
This option enables statement caching, and specifies how many
statements to cache. To disable statement caching just set this option to 0.
注:
A larger cache can result in improved performance, at the cost of
increased memory usage.
- oci8.default_prefetch
int
This option enables statement prefetching and sets the default number
of rows that will be fetched automatically after statement execution.
注:
A larger prefetch can result in improved performance, at the cost of
increased memory usage.
- oci8.old_oci_close_semantics
boolean
This option controls oci_close() behaviour.
Enabling it means that oci_close() will do
nothing; the connection will not be
closed until the end of the script. This is for backward
compatibility only. If you find that you need to enable this
setting, you are strongly encouraged to
remove the oci_close() calls from your
application instead of enabling this option.
以下常量由本扩展模块定义,因此只有在本扩展模块被编译到
PHP 中,或者在运行时被动态加载后才有效。
例子 1. 基本查询
<?php
$conn = oci_connect('hr', 'hr', 'orcl'); if (!$conn) { $e = oci_error(); print htmlentities($e['message']); exit; }
$query = 'SELECT * FROM DEPARTMENTS';
$stid = oci_parse($conn, $query); if (!$stid) { $e = oci_error($conn); print htmlentities($e['message']); exit; }
$r = oci_execute($stid, OCI_DEFAULT); if(!$r) { $e = oci_error($stid); echo htmlentities($e['message']); exit; }
print '<table border="1">'; while($row = oci_fetch_array($stid, OCI_RETURN_NULLS)) { print '<tr>'; foreach($row as $item) { print '<td>'.($item?htmlentities($item):' ').'</td>'; } print '</tr>'; } print '</table>';
oci_close($conn); ?>
|
|
例子 2. 用绑定变量插入
<?php
// Before running, create the table: // CREATE TABLE MYTABLE (mid NUMBER, myd VARCHAR2(20));
$conn = oci_connect('scott', 'tiger', 'orcl');
$query = 'INSERT INTO MYTABLE VALUES(:myid, :mydata)';
$stid = oci_parse($conn, $query);
$id = 60; $data = 'Some data';
oci_bind_by_name($stid, ':myid', $id); oci_bind_by_name($stid, ':mydata', $data);
$r = oci_execute($stid);
if($r) print "One row inserted";
oci_close($conn);
?>
|
|
例子 3. 将数据插入到 CLOB 列中
<?php
// Before running, create the table: // CREATE TABLE MYTABLE (mykey NUMBER, myclob CLOB);
$conn = oci_connect('scott', 'tiger', 'orcl');
$mykey = 12343; // arbitrary key for this example;
$sql = "INSERT INTO mytable (mykey, myclob) VALUES (:mykey, EMPTY_CLOB()) RETURNING myclob INTO :myclob";
$stid = oci_parse($conn, $sql); $clob = oci_new_descriptor($conn, OCI_D_LOB); oci_bind_by_name($stid, ":mykey", $mykey, 5); oci_bind_by_name($stid, ":myclob", $clob, -1, OCI_B_CLOB); oci_execute($stid, OCI_DEFAULT); $clob->save("A very long string");
oci_commit($conn);
// Fetching CLOB data
$query = 'SELECT myclob FROM mytable WHERE mykey = :mykey';
$stid = oci_parse ($conn, $query); oci_bind_by_name($stid, ":mykey", $mykey, 5); oci_execute($stid, OCI_DEFAULT);
print '<table border="1">'; while ($row = oci_fetch_array($stid, OCI_ASSOC)) { $result = $row['MYCLOB']->load(); print '<tr><td>'.$result.'</td></tr>'; } print '</table>';
?>
|
|
可以很容易地访问存储过程,就和从命令行访问一样。
例子 4. 使用存储过程
<?php // by webmaster at remoterealty dot com $sth = oci_parse($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:
oci_bind_by_name($sth, ":address_id", $addr_id, 10); oci_bind_by_name($sth, ":error_code", $errorcode, 10); oci_execute($sth);
?>
|
|
表格 3. 在从结果集中取得列时支持以下类型 类型 | 映射 |
---|
SQLT_RSET | 创建一个 oci statement 资源来代表指针。 | SQLT_RDD | 创建一个 ROWID 对象。 | SQLT_BLOB | 创建一个 LOB 对象。 | SQLT_CLOB | 创建一个 LOB 对象。 | SQLT_BFILE | 创建一个 LOB 对象。 | SQLT_LNG | 限制为 SQLT_CHR,返回为字符串。 | SQLT_LBI | 限制为 SQLT_BIN,返回为字符串。 | 任何其它类型 | 限制为 SQLT_CHR,返回为字符串。 |
| |