当前位置:   article > 正文

oracle 与sqlserver 的sql语句区别_oracle和sqlserver的语法区别

oracle和sqlserver的语法区别

以前一直连的都是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");

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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/217210?site
推荐阅读
相关标签
  

闽ICP备14008679号