SQLSEVER和ORACLE之间的区别

因这次的项目的主要功能是平台的迁移。平时也没有时间过行整理。刚好可以利用这次机会好好的整理。
ORALCE通过存储过程返回记录,相对SQLSERVER而言较为麻烦必需通过定义游标的方式返回.
以往的做法,只能通过程序包实现在程序包中定义返回记录引用游标变量
TYPE cur_name OUT IS REF CUROR;
而在存储过程参数中引用已经定义的游标变更
例如
   procedure procname(
   cur_pam out cur_name
   )
ORACLE 9i 版本以后增加了sys_recursor类型,从而我们不用重新定义游标变量
也不需要为了返回记录必需定义程序包才行。
具体实现如下
  CREATE OR REPLACE PROCEDURE Proc_Name(
    cur_Name OUT SYS_REFCURSOR
)
   AS
  BEGN
OPEN cur_Name FOR query sql
  END Proc_Name;

ORACLE 游标定义
以下是游标定义完整的例子
定义一个游标变量
DECLARE
  CURSOR cur_Name IS Query_SQL;
   EXCEPTION
    WHEN OTHERS THEN
  --记录存放列表
   list_Name cur_Name%ROWTYPE;
  BENG
    --循环循f
     FOR defList IN cur_Name LOOP
          --取列表中的值通常为 list_name.字段名称
  
     END LOOP;
  END;    
ORACLE 变更赋值 通过SQL语句给变更赋值时如果返回的记录为空ORALCE就会抛错出来。
处理方法:常用做法定义异常哑响应
                      EXCEPTION
                          WHEN NO_DATA_FOUND THEN
                           执行语句;

ORACLE 定义触发器时,需要注意的,如果要访问其它角色的表时必需要有SYSDBA的权限才能访问。
存储过程中使用了很多动态SQL语句执行命令
SQLSERVER 执行命令为 execute 简写 exec 直接返回结果
ORACLE  执行命令为 execute immediate   将记录集返回到游标变量或者将值返回到变量中
返回值的语法为  execute immediate query_sql into var
如果返回为记录集,自接通过游标返回
例如: DECLARE query_sql VARCHAR(1000);
  query_sql:='SELECT * FROM CPCINVORG WHERE INVORGID=170';
OPEN cur_Name FOR query_sql;
常用

SQLSERVER和ORACLE 临时表之间的区别
1.         SQL SERVER临时表是一种”内存表”,表是存储在内存中的.ORACLE临时表除非执行DROP TABLE,否则表定义会保留在数据字典中.
2.         SQL SERVER临时表不存在类似ORACLE临时表 事务级别 上的功能.
3         SQL SERVER本地临时表(#) 与 ORACLE的会话级别临时表类似,但是在会话退出的时候,ORACLE不会删除表.
4         SQL SERVER的全局临时表(##) 是指多个连接共享同一片内存.当没有指针引用该内存区域时,SQL SERVER自动释放全局临时表.
5         由于ORACLE不是一种 内存中的数据库. 所以如果ORACLE类似SQL SERVER 频繁的对临时表进行建立和删除,必定会影响性能.
所以ORACLE会保留临时表的定义直到用户DROP TABLE.
6         在ORACLE中,如果需要多个用户共享一个表(类似SQL SERVER的全局临时表##).则可以利用永久表,
并且在表中添加一些可以唯一标识用户的列.利用触发器和视图.当用户退出的时候,根据该登陆用户的唯一信息删除相应的表中的数据.
这种方法给ORACLE带来了一定量的负载
表和表之间的联接
SQLSERVER:
  左连接    *=(已过时) 或者 left join
  右连接    =*(已过时) 或者 right join
  强连接    == 或者 innerjoin
ORACLE
  左连接    (+)=或者left join
  右连接    =(+)或者right join
  强连接    == 或者 inner join

ORACLE 创建临时表的方法
CREATE GLOBAL TEMPORARY <TABLE_NAME> (<column specification>)
     ON COMMIT PRESERVE ROWS (会话临时表)
     在同一会话中不能 DROP TABLE TABLENAME;
     如果在会话中想强制删除临时表。先执行 TRUNCATE TABLE_NAME;
     OR ON COMMIT DELETE ROWS(事务临时表)

1.如何处理null值(F2中的null以10代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
--------数值间比较
2.求字符序号
S:select ascii('a') value
O:select ascii('a') value from dual
3.从序号求字符
S:select char(97) value
O:select chr(97) value from dual
4.连接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22')||33 value from dual
  
5.子串位置 --返回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from dual
  +在oracle 中属于运算符
6.模糊子串的位置 --返回2,参数去掉中间%则返回7
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6
7.求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from dual
8.子串代替 返回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual
9.子串全部替换
S:没发现
O:select Translate('fasdbfasegas','fa','我' ) value from dual
10.长度
S:len,datalength
O:length
11.大小写转换 lower,upper
12.单词首字母大写
S:没发现
O:select INITCAP('abcd dsaf df') value from dual
13.左补空格(LPAD的第一个参数为空格则同space函数)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from dual
14.右补空格(RPAD的第一个参数为空格则同space函数)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from dual
15.删除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim
16. 重复字符串
S:select REPLICATE('abcd',2) value
O:没发现
17.发音相似性比较(这两个单词返回值一样,发音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差
返回0-4,4为同音,1最高
--------------日期函数
18.系统时间
S:select getdate() value
O:select sysdate value from dual
19.前后几日
直接与整数相加减
20.求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from dual
select to_char(sysdate,'yyyy-mm-dd') value from dual
21.求时间
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from dual
22.取日期时间的其他部分
S:DATEPART 和 DATENAME 函数 (第一个参数决定)
O:to_char函数 第二个参数决定
参数---------------------------------下表需要补充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O无效)
dayofyear dy, y (O表星期)
day dd, d (d O无效)
week wk, ww (wk O无效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S无效)
minute mi, n (n O无效)
second ss, s (s O无效)
millisecond ms (O无效)
----------------------------------------------
23.当月最后一天
S:不知道
O:select LAST_DAY(sysdate) value from dual
24.本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
25.字符串转时间
S:可以直接转或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
26.求两日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用两个日期相减(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
27.根据差值求新的日期(比如分钟)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
28.求不同时区时间
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

ORACLE语句时考虑到性能 少量的使用in 和 not in 用 exists和 not exists代替),少用视图或者存储过程嵌套。如果需要嵌套,嵌套最多不能超过三层。
在使用SQL语句避免查询时全盘扫描。
在查询,更新,修改时,少用额外转换或者隐含转换
因为额外的转换或者隐含转换耗费资源,点用较多的存储空间,可能导致有较多的非法数据进入。
查询时导致无法使用到索引从而影响查询速度。
例如:从美芝存储过截取(Eam_GetRepairSearch)
  条件  where scmstockfixture.OrgId = EAM_RightOrg.orgid    
      and scmstockfixture.fixtureid = EamSynRepairHeader.Fixtureid    
      and datepart(yyyy,convert(datetime,EAMSynRepairHeader.repstoptime)) = @iyear          
      and datepart(mm,convert(datetime,EAMSynRepairHeader.repstoptime)) = @imonth  
  如果数据量过大的话,速度会很慢 如果当前SQL语句用户访问比较频繁将下列的SQL语句改成
     declare beg_Time varhcar(20);
      end_Time varhcar(20);
      
      beg_Time:=iyear||'-'||case when len(imonth)=1 then '0'||imonth else imonth end ||'-01'
      end_Time:=iyear||'-'||case when len(imonth)=1 then '0'||imonth else imonth end ||'-31'
      where scmstockfixture.OrgId = EAM_RightOrg.orgid    
      and scmstockfixture.fixtureid = EamSynRepairHeader.Fixtureid    
      and EAMSynRepairHeader.repstoptime>beg_Time        
      and EAMSynRepairHeader.repstoptime<end_Time;
如果当前SQL语句用户访问很少,一个月才访问十来次则将SQL改成
    where scmstockfixture.OrgId = EAM_RightOrg.orgid    
      and scmstockfixture.fixtureid = EamSynRepairHeader.Fixtureid    
      and EAMSynRepairHeader.repstoptime>iyear||'-'||case when len(imonth)=1 then '0'||imonth else imonth end ||'-01'        
      and EAMSynRepairHeader.repstoptimeiyear||'-'||case when len(imonth)=1 then '0'||imonth else imonth end ||'-31;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值