赞
踩
以前一直连的都是sqlsever,现在不是都国产化化了么,需要部署到云上,只能换成oracle或者是达梦的. 一些sqlsever 的sql 语句需要变成oracle或者达梦的语句,今天就先说一下oracle与sqlsever 的区别,我做的是springboot + mybatis项目.
区别:
1. oracle 语句不能";" 结尾
一般sql语句结尾带":",会报
java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
2.oracle 语句 表的字段用TRIM()(看情况决定)
数据库有些字段的值会自动补空格,我忘记在哪篇博客中看到过了
如果不用TRIM(), 数据库控制台上认为 " 你好 " = "你好"
maybatis里面认为 " 你好 " != "你好"
会造成 控制台执行sql语句能找到结果集,但是项目中找补到结果集
3.oracle 语句 用Nvl('字段',' ') 判断是否为空
sqlsever 用 IsNull(Max(VolumeID),0) 判断是否为空
oracle 用 NVL('host',' ')判断
4. oracle 语句 字段用别名
sql语句有时候查询出来的字段有时是大写的,即使数据表中字段名是驼峰式的,查出现是数据字段依然是大写,这样会造成解析不到想要的字段.
最好给字段设置别名,例如 select Computer as "Computer" 这样
5. oracle 语句 字段 没有 if Exists
以前 sql : if Exists(Select * from user where AEName= #{name})
oracle 只能改成
declare v_cnt number;
begin
select count(*) into v_cnt from dual where Exists(Select * from user where AEName= #{name})
if v_cnt > 0 then
.....
6. oracle语句 某个变量赋值用 ":="
oracle 语句 形如 : nRet :=3;
7. oracle 语句 只能有一个声明 declare,但可以声明多个变量
(1)oracle 里面不能像 sql server 需要用了再声明变量,只能一开始就声明好
(2)oracle 声明多个变量也只出现一个declare,sqlsever 每次都要声明
比如:
sqlserver
begin tran Declare @nVolumeID Int Declare @nVolumeAccessID Int Select @nVolumeAccessID = (IsNull(Max(AccessID),0)+1) From VolumeAccess Select @nVolumeID = (IsNull(Max(VolumeID),0)+1) From Volume
oracle:
declare strname varchar(255); v_cnt1 number; v_cnt2 number; begin
...
end;
(3)oracle declare声明之后 紧跟begin .. end 不用漏掉begin
8. oracle 语句报错用raise_application_error
sqlsever 里常用 RAISERROR
oracle 里一般用 raise_application_error
比如:
raise_application_error(-20001,'还包含该用户,无法删除'));
9. oracle 语句if 结构 一定要对应
oracle对于结构很严格, if 条件 then 语句1; else 语句2 end if;
10.oracle 语句 异常处理
oracle 一般先设置安全点,然后处理语句之后,如果出现异常会恢复到安全点
begin savepoint A; delete from Volume where VolumeID = #{volumeID}; delete from VolumeAccess where VolumeID = #{volumeID}; exception when others then begin raise_application_error(-20001,'删除失败!'); rollback to A; end; end;
11.oracle 语句 调用时, 区分存储过程和函数
存储过程调的时候 可以直接用 call proc1( a,b,c)
函数调用不能直接调用,需要
declare nRet number;
begin
nRet := fun(a,b,c);
..
end;
12. oracle 取值时需要用游标取存储过程和函数的返回值
在oracle 获取函数或存储过程的结果时,一般先在参数集 map中设置 一个变量为cursor的,我用的类型是
Map<String, Object> paramMap = new HashMap<>();
HashMap<String, Object> cursor = new HashMap<>();
然后在sql 语句中添加
("#{cursor,jdbcType=CURSOR,mode=OUT,javaType=ResultSet,resultMap=myMap}"
将结果用mymap来接, 这个mymap 也是map
<resultMap type="java.util.Map" id="myMap"> <id property="id" column="id"/> </resultMap>
可以去map取这个字段
List<Map<String, Object>> returnMap = (List<Map<String, Object>>) paramMap.get("cursor");
这个字段取到的值就是函数和存储过程的查询结果
今天就先写这样吧,下次再补充,嘿嘿
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。