oracle 与sqlserver 的sql语句区别

您所在的位置:网站首页 oracle和mysql的语句一样吗 oracle 与sqlserver 的sql语句区别

oracle 与sqlserver 的sql语句区别

2024-06-14 04:44| 来源: 网络整理| 查看: 265

以前一直连的都是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 paramMap = new HashMap(); HashMap cursor = new HashMap();

然后在sql 语句中添加 

("#{cursor,jdbcType=CURSOR,mode=OUT,javaType=ResultSet,resultMap=myMap}"

将结果用mymap来接, 这个mymap 也是map

可以去map取这个字段

List returnMap = (List) paramMap.get("cursor");

这个字段取到的值就是函数和存储过程的查询结果

今天就先写这样吧,下次再补充,嘿嘿

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3