oracle 与sqlserver 的sql语句区别 |
您所在的位置:网站首页 › oracle和mysql的语句一样吗 › oracle 与sqlserver 的sql语句区别 |
以前一直连的都是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 Volumeoracle: 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; beginnRet := 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 |