最近工作中将一论坛数据库从mysql转到oracle,mysql是一个很好用的小型数据库系统,使用它开发一些小型网站和软件是完全 可以胜任的,但到了对数据库高要求时,mysql可能就不大适合了,如一个大型的社区论坛,同时几千人访问,数量达到几十万,几百万时,这时候就需要使用 高性能的数据库系统了。oralce 是一个大型的数据库系统,很多开发者使用它。
现在介绍使用PHP开发的系统从mysql转到oracle 过程的关键点。
php部分
1、mysql_num_rows和oci_num_rows
mysql_num_rows是取mysql数据库结果集中的行数,oci_num_rows取oracle 查询的所受影响的行数。结果发现oci没有类似mysql_num_rows这样的函数,最后只能想出暂时的办法,再查询一次 SELECT COUNT(*) FROM …
2、mysql_insert_id函数
mysql_insert_id是mysql取插入数据自动产生的id什么sql为insertinto testtable(text) values ($text),$id=mysql_insert_id() ,oracle没有这个功能,解决办法只有写一个方法
functionget_seq_nextval($seqName) {
$rs = $this->get_one("SELECT$seqName.nextval from sys.dual",",0,0);
return $rs[0];
}
使用语句$id = $db->get_seq_nextval($seqName)取序列值,后SQL语句为insert into testtable(id,text)values ($id,$text)序列将在下面介绍。
SQL部分
1、关键字自动递增问题
mysql 中的auto_increment很好用但是oracle没有这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现。
假设关键字段为id,建一个序列,代码为:
create sequence seq_test_ids
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache
order;
建解发器代码为:
create or replace trigger tri_test_id
before insert on test_table
for each row
declare
nextid number;
begin
IF :new.id IS NULLor :new.id=0 THEN
select seq_test_id.nextval
into nextid
from sys.dual;
:new.id:=nextid;
end if;
end tri_test_id;
OK,上面的代码就可以实现自动递增的功能了。
2、分页LIMIT
mysql使用limit分页很方便,但是oracle分页就没有这么方便了,只有通过子查询来实现。
function query($SQL,$method=",$rowfrom =0,$rows = 0) {
if ($rowfrom || $rows) {
$rowfrom = 1;
$rowto = $rowfrom $rows-1;
$SQL = ’select * from(select row_.*, rownum rownum_ from (’
. $SQL . ‘)row_ where rownum <= ‘
. $rowto . ‘)where rownum_ >= ‘ . $rowfrom;
}
…
上面的代码就是查询方法的片断,这里可以看出oracle分页的实现了,$rowfrom表示第行开始,$rows表示显示的行数。
3、关键字问题
在oracle中关键字是不能用做表名字段名等的,如果定要用使用要双引号括起来,如"type"。
4、单引号的处理
在mysql中字符串是可以用双引号或单引号括起来。但oracle中就只能用单引号。能常在php程序中POST,GET提交的字符我们要用addcslashes使用反斜线转义字符串中的字符。
相当于’会转成\’,"会转成\"。但是在oracle,’转成’’,"不要处理,使用str_replace("’","’’",$str)就可以了。
现在介绍使用PHP开发的系统从mysql转到oracle 过程的关键点。
php部分
1、mysql_num_rows和oci_num_rows
mysql_num_rows是取mysql数据库结果集中的行数,oci_num_rows取oracle 查询的所受影响的行数。结果发现oci没有类似mysql_num_rows这样的函数,最后只能想出暂时的办法,再查询一次 SELECT COUNT(*) FROM …
2、mysql_insert_id函数
mysql_insert_id是mysql取插入数据自动产生的id什么sql为insertinto testtable(text) values ($text),$id=mysql_insert_id() ,oracle没有这个功能,解决办法只有写一个方法
functionget_seq_nextval($seqName) {
$rs = $this->get_one("SELECT$seqName.nextval from sys.dual",",0,0);
return $rs[0];
}
使用语句$id = $db->get_seq_nextval($seqName)取序列值,后SQL语句为insert into testtable(id,text)values ($id,$text)序列将在下面介绍。
SQL部分
1、关键字自动递增问题
mysql 中的auto_increment很好用但是oracle没有这样的功能,但是通过触发器(trigger)和序列(sequence)可以实现。
假设关键字段为id,建一个序列,代码为:
create sequence seq_test_ids
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache
order;
建解发器代码为:
create or replace trigger tri_test_id
before insert on test_table
for each row
declare
nextid number;
begin
IF :new.id IS NULLor :new.id=0 THEN
select seq_test_id.nextval
into nextid
from sys.dual;
:new.id:=nextid;
end if;
end tri_test_id;
OK,上面的代码就可以实现自动递增的功能了。
2、分页LIMIT
mysql使用limit分页很方便,但是oracle分页就没有这么方便了,只有通过子查询来实现。
function query($SQL,$method=",$rowfrom =0,$rows = 0) {
if ($rowfrom || $rows) {
$rowfrom = 1;
$rowto = $rowfrom $rows-1;
$SQL = ’select * from(select row_.*, rownum rownum_ from (’
. $SQL . ‘)row_ where rownum <= ‘
. $rowto . ‘)where rownum_ >= ‘ . $rowfrom;
}
…
上面的代码就是查询方法的片断,这里可以看出oracle分页的实现了,$rowfrom表示第行开始,$rows表示显示的行数。
3、关键字问题
在oracle中关键字是不能用做表名字段名等的,如果定要用使用要双引号括起来,如"type"。
4、单引号的处理
在mysql中字符串是可以用双引号或单引号括起来。但oracle中就只能用单引号。能常在php程序中POST,GET提交的字符我们要用addcslashes使用反斜线转义字符串中的字符。
相当于’会转成\’,"会转成\"。但是在oracle,’转成’’,"不要处理,使用str_replace("’","’’",$str)就可以了。