Oralce与Mysql在操作上有很大区别,比如:
-
Oralce字段使用关键字时需要加引号写到SQL中,如:user,order,size等。
-
Oralce没有limit而需要用numrow记录序号,如提取第三条后四数据:numrow>=3 and numrow<8
-
数据类型
-
Oralce没有auto_imcrement自增主键而需要使用序列等方式替代(SEQUENCE)
-
取最后插入主键,Oralce需要特殊处理,如查序列currval值
-
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