php操作Oralce

简介:

Oralce与Mysql在操作上有很大区别,比如:

  1. Oralce字段使用关键字时需要加引号写到SQL中,如:user,order,size等。

  2. Oralce没有limit而需要用numrow记录序号,如提取第三条后四数据:numrow>=3 and numrow<8

  3. 数据类型

  4. Oralce没有auto_imcrement自增主键而需要使用序列等方式替代(SEQUENCE)

  5. 取最后插入主键,Oralce需要特殊处理,如查序列currval值

  6. Oralce写超过4000字节数据需要特殊处理。



在这里说明自增主键和超过4000字节长数据。


使用序列自增

那么每个表都需要创建一个独立的序列,创建语句是:

1
2
3
4
5
6
7
CREATE  SEQUENCE  sequence   //创建序列名称
        [INCREMENT  BY  n]  //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
        [START  WITH  n]    //开始的值,递增默认是minvalue 递减是maxvalue
        [{MAXVALUE n | NOMAXVALUE}] //最大值
        [{MINVALUE n | NOMINVALUE}] //最小值
        [{CYCLE | NOCYCLE}] //循环/不循环
        [{CACHE n | NOCACHE}];//分配并存入到内存中


如:

1
2
3
4
5
6
CREATE  SEQUENCE  sq_name
     INCREMENT  BY  1   -- 每次加几个  
     START  WITH  1     -- 从1开始计数  
     NOMAXVALUE       -- 不设置最大值  
     NOCYCLE          -- 一直累加,不循环  
     CACHE 10;


每个序列包含:

  NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用,插入时当主键值使用
  CURRVAL 中存放序列的当前值,取最后插入主键ID时使用


插入数据时使用: sq_name.nextval  作为主键值(注意不能加引号)

如:

1
insert  into  table_name(id, name )value(sq_name.nextval, "OK" );

取出最近插入主键则需要使用SQL查询:

1
SELECT  sq_name.currval currval  FROM  dual


插入超长内容

oralce官方文档说明:http://www.oracle.com/technetwork/articles/fuecks-lobs-095315.html


使用oci函数处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//说明 empty_clob() 是创建一个空的clob如果是blob则使用empty_blob。
//需要增加 RETURNING语句来绑定空clob并指定占位符。
//插入与修改类似
$sql  = "UPDATE
            mylobs
         SET
             mylob = EMPTY_CLOB()
         WHERE
            id = 2403
         RETURNING
             mylob INTO :mylob";
 
$stmt  = oci_parse( $conn $sql );
//创建新的空 LOB 或 FILE 描述符,生成一个OCI-Lob对象,注意使用这个写文本实际是SQL先执行后回填内容,所以不能自动提交
$mylob  = oci_new_descriptor( $conn ,OCI_D_LOB);
 
//绑定占位符数据,注意最后一个参数一定要与字段数据类型一样。
oci_bind_by_name( $stmt , ':mylob' , $mylob , -1, OCI_B_CLOB);
 
//执行预处理SQL,注意不能自动提交需要一定要增加第二个参数,否则长文本无法写入。
oci_execute( $stmt , OCI_DEFAULT)  or  die  ( "Unable to execute query\n" );
 
//给OCI-Lob对象保存长文本内容,注意这里传入的参数将全部写入点位符中。
if  ( ! $mylob ->save(  'UPDATE: ' . date ( 'H:i:s' ,time()) ) ) {
 
     //保存失败回滚
     oci_rollback( $conn );
     
     die ( "Unable to update lob\n" );
     
}
//保存成功提交
oci_commit();

说明:如果使用oci函数在使用点位符时需要严格按数据类型走,否则会出错,所以使用oci_bind_by_name的方式时需要格外注意每个字段的数据类型是否匹配。


使用PDO处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//链接数据库
$pod = new  PDO( 'oci:dbname=test;charset=utf8' , 'system' , 'admin123456' );
 
//预处理SQL
$sth = $pod ->prepare( "INSERT INTO mylobs (id, mylob) VALUES (tslbh_xk.nextval, ?)" );
 
//要写入的clob越长内容
$val = 'INSERT:test contents' ;
 
//绑定参数,注意当是lob类型时需要指定数据长度,否则会报错类型不对
$sth ->bindParam(1,  $val , PDO::PARAM_STR, strlen ( $val ));
 
//执行SQL
$sth ->execute()  or  die  ( "Unable to execute query\n" );

说明:使用PDO的占位符也是需要指定数据类型,默认是PDO::PARAM_STR,包含execute函数。


最后因能力有限如果文本有错还请指出!

本文转自  ttlxihuan    51CTO博客,原文链接:http://blog.51cto.com/php2012web/1972479


相关文章
|
8月前
|
PHP
php的foreach神操作
php的foreach神操作
47 0
|
关系型数据库 MySQL PHP
PHP 原生操作 Mysql
PHP 原生操作 Mysql
124 0
|
7月前
|
PHP
php对memcached简单的操作
php对memcached简单的操作
42 0
|
7月前
|
SQL 关系型数据库 MySQL
php mysqli操作数据库
php mysqli操作数据库
52 0
|
8月前
|
安全 关系型数据库 MySQL
【PHP开发专栏】PHP PDO与MySQLi操作数据库
【4月更文挑战第30天】PHP数据库交互的核心是PDO和MySQLi。PDO提供数据访问抽象层,支持多种数据库,强调安全和灵活性;MySQLi则专为MySQL设计,有面向对象和过程化接口。两者都支持预处理语句,防止SQL注入。选择取决于项目需求,如可移植性、特定功能和API偏好。了解其使用有助于编写安全高效的代码。
135 2
|
8月前
|
PHP 数据安全/隐私保护
【PHP开发专栏】PHP魔术方法与对象操作
【4月更文挑战第30天】PHP 魔术方法是特殊方法,如`__construct`、`__get`等,在特定时刻自动调用,用于重写默认行为。本文分三部分介绍PHP魔术方法和对象操作:1) 魔术方法包括构造、析构、属性访问等,常用于控制访问权限、自动加载等;2) 对象操作涉及创建、访问属性和方法、克隆及序列化/反序列化;3) 案例展示如何在创建对象时设置默认值。
61 1
|
关系型数据库 MySQL 数据库连接
PHP 原生操作 Mysql 增删改查案例
PHP 原生操作 Mysql 增删改查案例
146 0
|
8月前
|
SQL PHP 数据库
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
|
8月前
|
NoSQL PHP Redis
PHP 操作Redis
PHP 操作Redis
65 0
|
关系型数据库 MySQL PHP
PHP 原生操作 Mysql 分页数据案例
PHP 原生操作 Mysql 分页数据案例
150 1