PHP+Oracle(OCI)初步

oracle

从Oracle(OCI)开始

在越来越多的PHP用户选择Oracle作为他们的数据库的情况下,如何访问PHP发布环境下的Oracle接口变的越发的重要了。我们将从快速的浏览一个简单基本且是更加明确的Oracle 的情况开始我们的旅程。Oralce 和Oralce8 使用PHP的OCI8 函数库。在PHP手册里有简要的说明(http://www.php.net/manual/ref.oci8.php):

这些函数允许你访问Oracle 和 Oracle7d 的数据库,它们使用的是Oracle8 Call-Interface(OCI8)。你将需要Oracle8 的客户端函数库来使用这些扩展功能。

这些扩展功能比起标准的Oracle扩展功能来更加的灵活,它支持PHP全局及本地变量及与Oracle的连编,有完整的LOB,FILE及ROWID的支持并且允许你定义用户补充变量。

从这里开始,我将使用“Oracle”指代任何Oracle版本,这篇文章假定你已经安装并运行了PHP和Oracle。而Oracle的帮助可以在http://www.oracle.com 或者 http://technet.oracle.com 找到。

本文的观点是
1.连接到ORALCLE
2.建立并运行SQL语句
3.显示结果
4.限制/偏移量 接近“标记页数”的结果

作为一个附加的功能。你可以看看如何完成显示一个从很大的数据结果得出的限制/偏移量的查询。
<?php

/*我们将从一个基础的使用显示一个方案。在这个例子里使用的文件是由Rod Kreisler编写的新版本的文章(http://www.phpbuilder.com/columns/rod20000221.php3)。新版本的文件可以在http://php.socket7.net 找到。把$offset设置为0,如果被设置为0或者空的话。
*/
if (empty($offset) || $offset < 0) {
$offset=0;
}

/*我们将从一个基础的使用显示一个方案。在这个例子里使用的文件是由Rod Kreisler编写的新版本的文章(http://www.phpbuilder.com/columns/rod20000221.php3)。新版本的文件可以在http://php.socket7.net 找到。把$offset设置为0,如果被设置为0或者空的话。
*/
if (empty($offset) || $offset < 0) {
$offset=0;
}

$limit = 3;
/*
连接到Oralce,如果你愿意的话,可以在连接数据库的时候直接使用ORACLE_SID。使用PHP作为CGI使用非连续的连接,现在让我们在这个例子里使用这种非连续的连接。在windows里这个可以在注册表里设置,而在unix里你可以使用 putenv()函数putenv(“ORALCE_SID=ORASID”);
或者 ,如果你愿意,你可以在连接数据库的时候直接参考你的ORACLE_SID,让我们在这个例子里直接参考ORACLE_SID。
如果你使用PHP作为APACHE的模块的话,你可以使用持续连接。而使用非持续连接在使用PHP时作为CGI时,我们在这个例子里使用非持续连接。
*/

$conn = OCILogon("user_name", "password", "ORASID");

/*
错误提示。在没有数据库被连接的情况下,将会显示的错误信息并且退出脚本的执行。
*/

if (!$conn) {
echo "<h1>ERROR - Could not connect to Oracle</h1>";
exit;
}

/*
如果连接成功,$conn就是一个连接符。否则,脚本将结束并且输出“Could not connect to Oracle”的错误信息
现在开始来分析并且创建你的SQL语句,由无限制的查询结果得到可以记数的记录。
在这里的格式语句“Select count(*) from table_name”相当于count(),是个SQL函数将会在数据库里执行。比由依靠PHP计算得到的返回结果要好。
*/

$sql = "Select count(*) from table_name";

$stmt = OCIParse($conn, $sql);
if(!$stmt) {
echo "<h1>ERROR - Could not parse SQL statement.</h1>";
exit;
}

/*
如果你输入了一个错误的SQL语句或者出现了另一个错误,你将看到“无法分析SQL”的错误提示,$stmt现在就是一个定义语句。
现在执行你的分析语句
*/

OCIExecute($stmt);

/*
语句现在已经被执行了,但是正如你所看到的,没有结果标志符从OCIExecute()返回,由OCIParse()返回的结果包含了所有Oracle所需要的信息。
现在开始选择这个查询的结果,$total rows[0]将会包含一个数。如果没有行被返回,则显示错误并退出脚本的运行。
*/

OCIFetchInto($stmt, &$total_rows);

if ( !$total_rows[0] ) {
echo "<h1>Error - no rows returned!</h1>";
exit;
}

/*
这段代码是可选择的但将会使返回的结果更清楚,显示一个类似于“总共有15条记录,现在显示的是第4条到第15条结果。”的注释
*/

$begin =($offset+1);
$end = ($begin+($limit-1));
if ($end > $total_rows[0]) {
$end = $total_rows[0];
}

echo "There are <b>$total_rows[0]</b> results.<br>n";
echo "Now showing results <b>$begin</b> to <b>$end</b>.<br><br>n";

/*
现在是言归正传的时候了,释放原先的语句标识然后建立SQL语句.分析并执行SQL语句,
写代码时需注意:不同于MYSQL,Oracle在SQL语句中不支持限制语句。就本身而言,有很多方法选择特定的行,最好的方法是把选择的结果放在一个临时表里或者“缓冲“所有的结果。这样的方法已经超出了这篇教程的范围了。我们将使用一个更简单的方法,在下面将进一步的解释。
*/
OCIFreeStatement($stmt);

$sql = "Select * from table_name";

$stmt = OCIParse($conn, $sql);

if(!$stmt) {
echo "<h1>ERROR - Could not parse SQL statement.</h1>";
exit;
}

OCIExecute($stmt);

/*
现在显示结果。最简单的做法是在结果集合中使用这个循环。HTML将用来显示最终的结果,但是这个范例非常的简单,所以我们一个也不会用。
编写代码时注意:如上述规定的,在Oracle里是无法限制的,所以我们必须通过在全部的结果集取出我们想要的和终止我们已经有的结果来做这个循环。
在这一小节里,我们将会有几种不同的方法,实际上应该有更好的方法来写这个代码。但是我认为我的这种方法不太容易读懂,它确实运行有效。
*/

$i=0;
$j=0;
while( OCIFetchInto($stmt, &$result_array) ) {
if ($i>=$offset) {
if ($j <$limit) {
for ($k=0; $k<=count($result_array); $k++) {
echo $result_array[$k]." ";
}
echo "
";
$j++;
}
}
$i++;
}
echo "
";

/*
结果将显示在当前的页面里,现在是给访问者一个使用NEXT/PREV点击到其他页面的时候了
*/

// 计算结果所需的页面数,
$pages = intval($total_rows[0]/$limit);

// $pages 现在是除剩余的部分外总共所需的页面数
if ($total_rows[0]%$limit) {
// has remainder so add one page
$pages++;
}

//在显示的是第一页时不显示PREV的连接
if ($offset!=0) {
$prevoffset=$offset-$limit;
echo "<a href="$PHP_SELF?offset=$prevoffset"><< PREV</a>   n";
}

// Now loop through the pages to create numbered links
// ex. 1 2 3 4 5 NEXT >>
for ($i=1;$i<=$pages;$i++) {
// Check if on current page
if (($offset/$limit) == ($i-1)) {
// $i is equal to current page, so don display a link
echo "$i   ";
} else {
// $i is NOT the current page, so display a link to page $i
$newoffset=$limit*($i-1);
echo "<a href="$PHP_SELF?offset=$newoffset">$i</a>   n";
}
}

//检查当前页面是否为最后一页
if (!((($offset/$limit)+1)==$pages) && $pages!=1) {
// Not on the last page yet, so display a NEXT Link
$newoffset=$offset+$limit;
echo "<a href="$PHP_SELF?offset=$newoffset">NEXT >></a><p>n";
}

/*
现在我们完成了有关Oracle的任务,所以释放最后的语句标识并且退出。
*/

OCIFreeStatement($stmt);
OCILogoff($conn);

?>

时间: 2024-08-17 13:55:36

PHP+Oracle(OCI)初步的相关文章

基于Oracle OCI的数据访问C语言接口ORADBI(上)

ORADBI是我在Oracle OCI(Oracle 调用接口)基础上开发的,支持Oracle8i.9i.10g等数据库.根据Oracle公司的介绍:OCI是如此可靠,以至于Oracle数据库中的每一条SQL语句都通过OCI来执行.当应用程序开发人员需要面向Oracle数据库服务器的最强大的接口时,他们将调用 Oracle调用接口(OCI).OCI提供了对所有Oracle数据库功能的最全面的访问.OCI API中包含了最新的性能.可伸缩性和安全性特性. 采用OCI的最大好处就是:它是最切近Ora

oracle oci 的 OCIEnv 结构体 在 哪个文件中定义

问题描述 oracle oci 的 OCIEnv 结构体 在 哪个文件中定义 请教大家一个问题程序报错: 使用了未定义类型"OCIEnv" 我在 oci.h中找到 typedef struct OCIEnv OCIEnv; /* OCI environment handle */ 文件 但是不知道struct OCIEnv 结构体在哪个文件中定义,麻烦大家帮忙解答 解决方案 C语言中怎样调用其他文件定义的结构体 解决方案二: 在线等,麻烦大侠们帮忙解答,谢谢

oracle10g-用jdbc:oracle:oci方式连接数据库时出现UnsatisfiedLinkError错误

问题描述 用jdbc:oracle:oci方式连接数据库时出现UnsatisfiedLinkError错误 我win7 64位系统,jdk是64位的1.7版本,oracle装的是32的10g,客户端跟服务器端都装了,我在用jdbc:oracle:oci方式连接数据库时连接失败,而用jdbc:oracle:thin方式就行,错误如下: java.lang.IllegalStateException: Failed to load ApplicationContext at org.springfr

基于Oracle OCI的数据访问C语言接口ORADBI .

  基于Oracle OCI的数据访问C语言接口ORADBI cheungmine@gmail.com Mar. 22, 2008   ORADBI是我在Oracle OCI(Oracle 调用接口)基础上开发的,支持Oracle8i.9i.10g等数据库.根据Oracle公司的介绍:OCI是如此可靠,以至于Oracle数据库中的每一条SQL语句都通过OCI来执行.当应用程序开发人员需要面向Oracle数据库服务器的最强大的接口时,他们将调用 Oracle调用接口(OCI).OCI提供了对所有O

基于Oracle OCI的数据访问C语言接口ORADBI(下)

/*====================================================================== column Functions - oracol.c ======================================================================*/ /* returns column data type */ ORADB_CALL1(const char*) ORA_column_get_name

用PHP操纵Oracle的LOB类型的数据

oracle|数据 <PHP+Oracle(OCI) 初步>中讲了如何用PHP中的OCI函数来连接Oracle数据库,执行一些SQL查询及关闭数据库连接.本文将讲述另一个难度稍大的问题:用PHP的OCI函数来操纵Oracle的LOB字段.阅读本文需要<PHP+Oracle(OCI) 初步>一文中的知识. 用过Oracle的人都知道,Oracle有一种数据类型叫VARCHAR2,用来表示不定长的字符串.VARCHAR2也是Oracle公司推荐使用的类型.但使用VARCHAR2有个问题

java web jdbc oci 方式连接oracle报错UnsatisfiedLinkError

问题描述 环境为AIX Version 5.3!sqlplus sqlldr 可用,java web jdbc oci 方式连接数据库不成功Connection conn = null; Statement stmt = null; ResultSet rs = null; try { Class.forName("oracle.jdbc.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:oci:@

[Oracle]利用开源工具实现自己的TPC-C

oracle [Oracle] How to Use Open Source Tools to Implement Your Own TPC-C 作者:Fenng 日期:Mar 14 2004 (v0.13)站点:Http://www.dbanotes.net 本文简介 介绍如何利用开源工具实现Oracle数据库环境中的TPC-C.对DBA.开发人员.BI实施者有一定的参考价值. 引言描述 设想一下这样一种情况: 您正在负责公司的一个OLTP类型的数据库项目,面临数据库服务器选型的问题:如何选择

把Oracle数据库移植到Microsoft SQL Server 7.0

oracle|server|数据|数据库  把Oracle数据库移植到Microsoft SQL Server 7.0 摘要:本文是为那些想把自己的Oracle应用程序转换为Microsoft SQL Server应用程序的开发人员编写的.本文描述了一个成功的转换所需要的工具.过程和技术.同时强调了建立高性能.高度并行的SQL Server应用程序的基本的设计要素. 本文的读者应该具有: Oracle关系型数据管理系统(RDBMS)的坚实基础. 普通数据库管理知识. 熟悉Oracle SQL和P