电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

sql server vs oracle 存储过程语法转换12

15页
  • 卖家[上传人]:小**
  • 文档编号:89127253
  • 上传时间:2019-05-19
  • 文档格式:DOC
  • 文档大小:67.50KB
  • / 15 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、一、SQL Server vs Oracle简单语法比较此为本人将ORACLE 函数和存储过程转换为SQL SERVER遇到的一些语法问题的经验总结,肯定不能包括所有的语法不同点。注: 简单的语法异同1、SQL SERVER变量 必须以开头。2、SQL SERVER语句后不需要写分号结束符。3、oracle变量类型number 可以修改为sql server的decimal4、oracle变量类型varchar2 可以修改为sql server的varchar5、SQL SERVER定义变量 及传递参数,最好加上参数大小数值,例如:varchar(50)5、SQL SERVER 不能用ROWID, ROWNUM (但可以用TOP代替)6、oracle里的nvl函数,在SQL SERVER里使用ISNULL函数取代7、SQL SERVER自定义函数不允许修改全局表数据(只允许修改自定义函数范围内表数据), 所以发生表修改的 最好用存储过程实现而非函数。1create函数或存储过程异同点Oracle 创建函数或存储过程 一般是 create or replace SQL SERVER 则是

      2、在创建之前加一条语句,先判断是否已经存在,如果存在删除已有的函数或存储过程。函数语句if exists (select * from dbo.sysobjects where id = object_id(Ndbo.函数名) and xtype in (NFN, NIF, NTF)drop function dbo.函数名GO存储过程if exists (select * from dbo.sysobjects where id = object_id(Ndbo.存储过程名) and OBJECTPROPERTY(id, NIsProcedure) = 1)drop procedure dbo.存储过程名GO2 结构异同点ORACLECreate 部分IS 定义部分BEGIN END; 实现部分SQL SERVERCreate 部分AS 定义和实现部分 (AS 下面的代码一般用BEGIN END 包含)3 调用参数ORACLE输入参数 参数名In 参数类型ORACLE输出参数 参数名Out参数类型SQL SERVER输入参数 参数名参数类型 IN(IN可以不写,系统默认)SQL SER

      3、VER输出参数 参数名 参数类型 OUTPUT4变量命名及赋值ORACLE1、变量名 随便取2、定义格式为变量名 变量类型;3、给变量赋值为 变量名 := 值;SQL SERVER1、变量名前面一般加2、定义格式为 declare 变量名 变量类型3、SET变量名 =变量类型5 IF语句ORACLEIF THEN .ELSE .END IF;SQL SERVERIF .BEGIN ENDELSEBEGINEND或者IF . BEGIN ENDELSEBEGIN END6 case语句ORACLEIF THEN .ELSE .END IF;SQL SERVERIF . BEGIN ENDELSEBEGIN END或者IF . BEGIN ENDELSEBEGIN END7游标的定义及使用 及循环操作ORACLE定义游标CURSOR CurA IS SELECT a FROM tab where ;SQL SERVER定义游标DECLARE CurA CURSOR LOCALFORSELECT a FROM tab where ;ORACLE使用游标Open CurA; - 打开游标Fet

      4、ch CurA Into ISUserUnitPri;IF CurA%NOTFOUND THEN - 注:如果为CurA%FOUND,看下面相同位置注释ISUserUnitPri := 1;END IF;Close CurA; - 关闭游标SQL SERVER使用游标Open CurA - 打开游标Fetch next from CurA Into ISUserUnitPriIF fetch_status 0 BEGIN - 注: 则fetch_status = 0 SET ISUserUnitPri = 1 - 没有选到记录 给默认值1ENDClose CurA - 关闭游标DEALLOCATECurA - 释放占用资源ORACLE循环操作游标 (超级简洁)FOR ISUserUnitPri IN CurALOOP- 做操作END LOOP;注:想循环中间退出循环,用EXITSQL SERVER循环操作游标Open CurA - 打开游标Fetch next from CurA Into ISUserUnitPriWhile (fetch_status = 0 ) BEGIN. -

      5、做操作Fetch next from CurA Into ISUserUnitPriENDClose CurA - 关闭游标DEALLOCATECurA - 释放占用资源注:想循环中间退出循环,用BREAK注意:SQL SERVER 使用游标完后,需要删除游标引用(DEALLOCATE cursor_name)。8 计算时间差ORACLEOracle 两个时间相减 得到一个以天为单位的带小数的值,需要根据自己的需要再换算成秒值。- 这里为 取START_QUEUE_TIME到当前时间的秒数(SYSDATE - START_QUEUE_TIME)*24*60*60SQL SERVERSQL SERVER两个时间相减 得到还是时间(从1900-01-01 00:00:00.000开始的时间)。所以想得到以秒的时间差,这么做就麻烦了。SQL SERVER取时间差,专门有一个DATEDIFF函数,具体看SQL SERVER帮助。- 这里为 取START_QUEUE_TIME到当前时间的秒数DATEDIFF(second, START_QUEUE_TIME,GETDATE()9 top N 问题

      6、 在sql server中,top N 问题很容易解决,如下例:从表stbdbdj中选取排序后的第一行数据进行赋值。在sql中解决方法很简单,在select 后面加上:top n 即可,其中 n 代表行数。 selecttop1entrust_date=entrust_date,entrust_no=entrust_nofromrun2k.stbdbdjwhereentrust_date=dateandentrust_noentrust_no_qandreport_status=1orderbyentrust_date,entrust_no;在oracle中,没有top n这个命令,我们采取把两层查询方式解决:首先,把需要查找的字段值直接进行排序,然后在外面进行第二次查询,并使用rownum决定行数。selectentrust_date,entrust_nointoentrust_date,entrust_nofrom(selectentrust_date,entrust_nofromstbdbdjwhereentrust_date=dateandentrust_noentrust_n

      7、o_qandreport_status=1orderbyentrust_date,entrust_no)whererownumber=1;10 如何解决结果集返回时,* 和变量同时存在的问题下面例子表示,在用游标返回结果集时,同时返回一个变量的值,在sql server中代码如下所示:selecta.*,b.organ_idfromrun2k.stbbpa,run2k.stkaccoargbwherea.date=entrust_dateanda.serial_no=serial_noanda.branch_no=b.branch_noanda.exchange_type=b.exchange_type;但在oracle中却没有这种用法,*后面必需跟from。解决方法如下:1)我们可以把 * 变成所需要选择的字段,就是说采用表中需要显示的全部字段表示*。例如:openp_cursorforselectbranch_no,.,organ_idwhere.2)如果这个字段或者说变量是从另外一张表中取出来的,同样可以采用下面的办法。openp_cursorforselecta.*,b.org

      8、an_id;fromstkaccoentrusta,stkaccoargbwherea.branch_no=b.branch_noanda.exchange_type=b.exchange_typeanda.init_date=v_entrust_dateanda.serial_no=v_serial_no;11 外联接问题Sql server oracle a = *b a(+)= ba *= b a = b(+)12 多条记录求和问题select sum(A+B+C)into Dfrom .where .group by .单条记录求和select A+Binto Cfrom .where .13用SQL SERVER里CASE函数替换DECODE函数替换ORACLEdecode(client_status,0,正常,1,冻结,2,挂失,3,销户,未知);SQL SERVER 没有DECODE函数case client_statuswhen 0 then 正常when 1 then 冻结when 2 then 挂失when 3 then 销户else 未知end注: 有趣的是 ORACLE的CASE函数,在SQL SERVER里没有找到替代的,只好用IF ELSE 语句解决。14 oracle的select into 问题ORACLE里直接取字段值,用select into语法select unit_id into unitid from call_user_table where user_id = 1231312;

      《sql server vs oracle 存储过程语法转换12》由会员小**分享,可在线阅读,更多相关《sql server vs oracle 存储过程语法转换12》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2 2022年小学体育教师学期工作总结 2022年家长会心得体会集合15篇
     
    收藏店铺
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.