PHP操作Oracle数据库
(这是来自“百度文库”中的文章写得很不错)
PHP操作Oracle数据库(OCI数据抽象层)
OCI(Oracle 8 Call-Interface)是PHP中内置的数据库抽象层函数。
下面针对连接Oracle数据库操作数据库的常见任务举例说明:
=======================基本查询:无条件查询===================
1、数据库连接:函数:oci_connect()
函数:resource oci_connect ( string username, string password [, string db [, string charset [, int session_mode]]] )
说明: 函数的返回值为资源
username、password:是Oracle的用户名密码,即方案名及密码
db:是可选参数,如果使用本地的Oracle实例或者使用tnsnames.ora配置文件中注册的本地服务名,直接提供其名称即可。
如果此参数留空,则使用本地的ORACLE_SID或者搜索tnsnames.ora文件的注册的默认本地服务名。
charset:参数是在Oracle9.2以上的版本使用的参数,默认可以留空,使用NLS_LANG 环境变量替代。
session_mode:用于设定使用特权身份登录(默认禁用),默认有3个选项:OCI_DEFAULT,OCI_SYSOPER 和 OCI_SYSDBA
范例:连接本机注册的本地服务名为hy的Oracle实例,用户名/密码为scott/tiger
<?php
//建立连接
$conn=oci_connect("scott","tiger","hy");
//检查连接是否成功
if($conn){
echo "connect success";
}
else{
echo "connect error";
}
?>
2、编译SQL语句:函数:oci_parse()
函数:resource oci_parse ( resource connection, string query )
说明: 函数返回值为资源,编译以字符串形式提供的SQL语句
connection:为在第一步中创建的链接资源标识符
query:是一个查询字符串,用双引号引起来。
在 connection 上配置 query 并返回语句标识符以用于 oci_bind_by_name(),oci_execute() 以及其它函数
<?php
$stmt=oci_parse($conn,"select * from emp");
?>
3、执行SQL语句:函数:oci_execute();
函数:bool oci_execute ( resource stmt [, int mode] )
说明: 函数返回布尔值,执行一条之前被解析过的语句
stmt:在第二步创建的编译资源名
mode:允许定义执行模式,
OCI_COMMIT_ON_SUCCESS(默认):语句执行成功则自动提交
OCI_DEFAULT:自动建立一个事务,此事务会在连接关闭或者脚本结束自动回退,如果想提交,需要明确调用oci_commit() 提交事务,或者调用oci_rollback()回退事务
<?php
oci_execute($stmt,OCI_DEFAULT);
?>
4、提取查询的结果:
函数: int oci_fetch_all ( resource statement, array &output [, int skip [, int maxrows [, int flags]]] )
提取所有的结果数据到数组(返回获取数据的行数)
array oci_fetch_array ( resource statement [, int mode] )
提取结果数据的一行到一个关联数组(OCI_ASSOC)或者数字索引数组(OCI_NUM )或两者(OCI_BOTH)等
array oci_fetch_assoc ( resource statement )
提取结果数据的一行到一个关联数组
object oci_fetch_object ( resource statement )
提取结果数据的一行到一个对象
array oci_fetch_row ( resource statement )
提取结果数据的一行到一个数字索引数组
<?php
$result=oci_fetch_assoc($stmt);
print_r($result);
?>
5、释放资源:
函数: bool oci_free_statement ( resource statement )
释放关联于语句或游标的所有资源
bool oci_close ( resource connection )
关闭 Oracle数据库连接
<?php
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
=======================基本查询:有查询条件的查询===================
1、数据库连接(略)
2、编译SQL语句(略)
3、绑定变量及执行:
函数:bool oci_bind_by_name ( resource stmt, string ph_name, mixed &variable [, int maxlength [, int type]] )
将 PHP 变量 variable 绑定到 Oracle 的位置标志符 ph_name。length 参数确定该绑定的最大长度,如果要绑定一个
抽象数据类型,使用type参数
<?php
$Oracle_conn=oci_connect("scott","tiger","hy");
$query="select * from emp where job=upper(:job) and deptno=upper(:deptno)";
$statement=oci_parse($Oracle_conn,$query);
//设置绑定变量的取值
$job="CLERK";
$deptno=10;
oci_bind_by_name($statement,":job",$job);
oci_bind_by_name($statement,":deptno",$deptno);
//执行语句
oci_execute($statement);
//取得结果数据
oci_fetch_all($statement,$result);
foreach($result as $rows){
echo "";
foreach($rows as $col_values){
echo $col_values;
}
}
//释放资源
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
=========================数据插入操作===================
=======================1、通过变量提供值======================
1、数据库连接(略)
2、编译SQL语句(略)
3、绑定变量及执行:
<?php
$Oracle_conn=oci_connect("scott","tiger","hy");
$query="insert into emps(empno,ename,sal,hiredate) values(:empno,:ename,:sal,:hiredate)";
$statement=oci_parse($Oracle_conn,$query);
//===============设置绑定变量的取值(通过变量提供值)================
$empno=1203;
$ename='TEST';
$sal=1500;
$hiredate='03-12月-81';//如果是使用Oracle数据库服务器时间,则在DML语句中直接提供sysdate
oci_bind_by_name($statement,":empno",$empno);
oci_bind_by_name($statement,":ename",$ename);
oci_bind_by_name($statement,":sal",$sal);
oci_bind_by_name($statement,":hiredate",$hiredate);
//执行语句,设置执行模式为自动提交
oci_execute($statement,OCI_COMMIT_ON_SUCCESS);
//检查影响的行数
if(oci_num_rows){
echo "插入成功";
}
//释放资源
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
=======================2、通过数组提供值======================
<?php
$Oracle_conn=oci_connect("scott","tiger","hy");
$query="insert into emps(empno,ename) values(:empno,:ename)";
$statement=oci_parse($Oracle_conn,$query);
//===============设置绑定变量的取值(通过数组提供值)================
$data=array(
1884=>"a",
1885=>"b",
1886=>"c");
oci_bind_by_name($statement,":empno",$empno,32);
oci_bind_by_name($statement,":ename",$ename,32);
foreach ($data as $empno => $ename) {
if(oci_execute($statement)){
echo "插入成功"."";
}
}
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
=======================PHP调用存储过程=========================
<?php
//连接数据库
$Oracle_conn=oci_connect("scott","tiger","hy");
/*定义调用语句(此处执行一个具有输入参数和返回游标的存储过程)
存储过程的代码如下:
create or replace procedure get_emp_inf
(v_deptno in emp.deptno%type,v_res out sys_refcursor)
is
begin
open v_res for select * from emp where deptno=v_deptno;
end get_emp_inf;
存储过程的调用语句的写法有:begin...end和call两种写法
*/
//分配并返回一个游标句柄
$cur=oci_new_cursor($Oracle_conn);
//创建调用语句
$query="call get_emp_inf(:deptno,:v_cur)";
$statement=oci_parse($Oracle_conn,$query);
//提供输入参数
$deptno=10;
//绑定游标句柄,接收返回的游标参数
oci_bind_by_name($statement,":deptno",$deptno,16);
oci_bind_by_name($statement,":v_cur",$cur,-1,OCI_B_CURSOR);
//执行
oci_execute($statement);
//获取返回的游标数据到游标句柄
oci_execute($cur);
//遍历游标内容
while ($dat = oci_fetch_row($cur)) {
var_dump($dat);
}
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
=======================PHP调用存储函数=========================
<?php
//连接数据库
$Oracle_conn=oci_connect("scott","tiger","hy");
/*定义调用语句(此处执行一个具有一个输入参数的函数)
存储函数的代码如下:
/*
create or replace function chk_emp_exist
(v_empno emp.empno%type)
return int
as
v_num int;
begin
select count(rowid) into v_num from emp where empno=v_empno;
if v_num<>0 then
return 1;
else
return -1;
end if;
end;
存储函数的调用语句的写法有两种写法,第一种使用begin...end;,第二种可以在一个select语句中调用,但是仅限于没有输出参数的
*/
//创建调用语句
$query="begin :res:=chk_emp_exist(:empno); end;";
$statement=oci_parse($Oracle_conn,$query);
//提供输入参数
$empno=10;
$res=-100;//返回值可能出现负值,所以初始化时用负值
//绑定变量,接收返回的参数
oci_bind_by_name($statement,":res",$res);
oci_bind_by_name($statement,":empno",$empno);
//执行
oci_execute($statement);
//判断是否存在
if($res==1){
echo "此员工存在";
}
else{
echo "此员工不存在";
}
oci_free_statement($statement);
oci_close($Oracle_conn);
?>
PHP操作Oracle数据库的更多相关文章
- ASP.NET操作ORACLE数据库之模糊查询
ASP.NET操作ORACLE数据库之模糊查询 一.ASP.NET MVC利用OracleHelper辅助类操作ORACLE数据库 //连接Oracle数据库的连接字符串 string connect ...
- Java操作Oracle数据库以及调用存储过程
操作Oracle数据库 publicclass DBConnection { //jdbc:oracle:thin:@localhost:1521:orcl publicstaticf ...
- Python使用cx_Oracle模块连接操作Oracle数据库
1. 简单介绍 cx_Oracle 是一个用来连接并操作 Oracle 数据库的 Python 扩展模块, 支持包含 Oracle 9.2 10.2 以及 11.1 等版本号 2.安装 最好是去官网h ...
- Java java jdbc thin远程连接并操作Oracle数据库
JAVA jdbc thin远程连接并操作Oracle数据库 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 编码工具:Eclipse 编码平台:W ...
- loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试
调用java jar文件远程操作Oracle数据库测试 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 Loadrunner:11 备注:想学ora ...
- 使用ADO.NET操作Oracle数据库
本文将示例使用C#的ADO.NET技术调用Oralce的存储过程和函数及操作Oracle数据库. 在oracle的hr数据库中建立存储过程 在oralce的hr数据库中建立函数 新建控制台项目,在主函 ...
- 连接Linux服务器操作Oracle数据库
连接Linux服务器操作Oracle数据库 由于项目已经上线,现场的数据库服务器不允许直接用Oracle的客户端plsqldev.exe来连接,只能通过Linux服务器的命令来操作. 以下是用Se ...
- 在shell终端操作oracle数据库的常用命令
这里面是在一个项目中用到的操作oracle数据库的常用linux命令,因为当时无法用plsql远程连接,大部分操作都需要在命令行窗口进行,总结一下 第一种方式 (1)先切换至sqlplus [orac ...
- python操作oracle数据库-查询
python操作oracle数据库-查询 参照文档 http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python- ...
随机推荐
- bzoj 1500: [NOI2005]维修数列 splay
1500: [NOI2005]维修数列 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 6556 Solved: 1963[Submit][Status ...
- Codeforces 731D Funny Game
Description Once upon a time Petya and Gena gathered after another programming competition and decid ...
- ios7新特性3-Map Kit新特性
Map Kit 框架 (MapKit.framework) 包含了大量的改进以及为基于地图的程序提供了新特性.利用地图显示位置信息的应用现在可以使用Maps这个程序用到的3D地图,包括控制程序控制视线 ...
- Delphi的Owner与Parent可以不一致,而且Owner不是必须存在(一共7个问题) good
问题1:Owner与Parent不一致:新建一个Form,上面放一个Button1,一个Panel1,然后在Panel1上再放一个Button2,测试结果:procedure TForm1.Butto ...
- 14.6.6 Configuring Thread Concurrency for InnoDB 配置线程并发
14.6.6 Configuring Thread Concurrency for InnoDB 配置线程并发 InnoDB 使用操作系统线程来处理请求(用户事务) 事务可能执行很多次在它们提交或者回 ...
- HDU-4089 Activation
http://acm.hdu.edu.cn/showproblem.php?pid=4089 Activation Time Limit: 20000/10000 MS (Java/Others) ...
- excel小技巧-用于测试用例的编号栏:“获取当前单元格的上一格的值+1”=INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1
编写用例的时候使用,经常修改用例的时候会需要增加.删除.修改条目,如果用下拉更新数值的方式会很麻烦. 1.使用ctrl下拉,增删移动用例的时候,需要每次都去拉,万一列表比较长,会很麻烦 2.使用ROW ...
- UVa816 Abbott's Revenge
Abbott's Revenge Time limit: 3.000 seconds Abbott’s Revenge Abbott’s Revenge The 1999 World FinalsC ...
- hdu 4293 dp求最大权值不重合区间
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4293 #include<cstdio> #include<cstring> # ...
- ndk编译时的通用Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := live555 MY_SRC_PATH := $(LOCAL_PA ...