网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

oracle与sqlserver语法函数比较

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

【网学网提醒】:以下是网学会员为您推荐的oracle与sqlserver语法函数比较,希望本篇文章对您学习有所帮助。


    oracle与sqlserver语法函数比较
    异种数据库函数和标准SQL语法比较0引言在实际工作当中,常常会遇到同种功能在异种数据库中函数的实现方法和SQL语法的实现方法,时间的累积效应显示,提高这部分的空缺,无疑对使用数据库的人员来说,都有非常现实的意义。从另外一翼来说,异种数据库函数和标准SQL语法等的比较,对于开发二次平台提供一个有力的参照,将尽快形成属于自己的一套语法和函数体系。最终使应用开发端和后台数据库实现无关联性,即不论后台数据库系统如何变化,通过二次开发平台转换之后,应用程序不作改动,或尽量少地改动。
    1.异种数据库函数比较1.1字符串函数比较下面是Oracle支持的字符函数和它们的MicrosoftSQLServer等价函数。
    函数把字符转换为ASCII字串连接把ASCII转换为字符返回字符串中的开始字符(左起)把字符转换为小写把字符转换为大写填充字符串的左边清除开始的空白清除尾部的空白字符串中的起始模式(pattern)多次重复字符串字符串的语音表示重复空格的字串从数字数据转换为字符数据
    OracleASCIICONCATCHRINSTR
    MicrosoftSQLServerASCII(expression+expression)CHARCHARINDEX
    LOWERUPPERLPADLTRIMRTRIMINSTR
    LOWERUPPERN/ALTRIMRTRIMPATINDEX
    RPADSOUNDEXRPADTO_CHAR
    REPLICATESOUNDEXSPACESTR
     子串替换字符将字符串中的每个词首字母大写翻译字符串字符串长度列表中最大的字符串列表中最小的字符串如果为NULL则转换为相应的字符串获取行号作为流水号
    SUBSTRREPLACEINITCAP
    SUBSTRINGSTUFFN/A
    TRANSLATELENGTHGREATESTLEASTNVL
    N/ADATELENGTHorLENN/AN/AISNULL
    Rownumascindex
    Identity(int,1,1)ascindex
    1.2数字函数比较下面是Oracle支持的数字/数学函数以及它们的MicrosoftSQLServer等价函数。
    函数功能介绍绝对值求余炫弧度求正炫弧度求N的弧度求n和m的弧度最小整数>=value余炫数的指数最大整数值<=value求自然对数求对数
    OracleABSACOSASINATANATAN2CEILCOSEXPFLOORLNLOG(N)
    MicrosoftSQLServerABSACOSASINATANATN2CEILINGCOSEXPFLOORLOGN/A
     求以10为底的对数求模
    LOG(10)MOD
    LOG10USEOPERATORMODULO(%)
    求幂求随机数窃取范围取符号求正炫求双曲线正炫截取函数转变函数
    POWERN/AROUNDSIGNSINSINHTRUNCNVL
    POWERRANDROUNDSIGNSINN/AN/AISNULL
    说明:本表中,设计的函数,其功能请参照文档《异种数据库初探》。
    1.3转换函数比较下面是Oracle支持的转换函数和它们的MicrosoftSQLServer等价函数。
    函数数字转换为字符字符转换为数字日期转换为字符字符转换为日期16进制转换为2进制2进制转换为16进制
    OracleTO_CHART
    O_NUMBERTO_CHARTO_DATEHEX_TO_RAWRAW_TO_HEX
    MicrosoftSQLServerCONVERTCONVERTCONVERTCONVERTCONVERTCONVERT
    1.4其它函数比较日期函数下面是Oracle支持的日期函数和它们的MicrosoftSQLServer等价函数。
     函数日期相加
    Oracle(datecolumn+/-value)orADD_MONTHS
    MicrosoftSQLServerDATEADD
    两个日期的差
    (datecolumn+/-value)orMONTHS_BETWEEN
    DATEDIFF
    当前日期和时间一个月的最后一天时区转换日期后的第一个周日代表日期的字符串代表日期的整数
    SYSDATELAST_DAYNEW_TIMENEXT_DAYTO_CHARTO_NUMBER(TO_CHAR))
    GETDATE()N/AN/AN/ADATENAMEDATEPART
    日期舍入日期截断字符串转换为日期如果为NULL则转换为日期
    ROUNDTRUNCTO_DATENVL
    CONVERTCONVERTCONVERTISNULL
    2.异种数据库SQL语法比较2.1查询语句语法比较SQLServer不支持面向Oracle的基于开销的优化器,必须把这些清除掉。建议使用SQLServer的基于开销的优化器。2.1.1ORACLE中查询语句的语法:SELECT[/*+optimizer_hints*/][ALL|DISTINCT]select_list[FROM{table_name|view_name|[WHEREclause][GROUPBYgroup_by_expression][HAVINGsearch_condition][STARTWITH…CONNECTBY][{UNION|UNIONALL|INTERSECT|select_statement}]
     MINUS}SELECT…][ORDERBYclause][FORUPDATE]2.1.2SQLSERVER中查询语句的语法:SELECTselect_list[INTOnew_table_]FROMtable_source[WHEREsearch_condition][GROUPBY[ALL]group_by_expression[,…n][WITH{CUBE|ROLLUP}][HAVINGsearch_condition][ORDERBYorder_expression[ASC|DESC]]Inaddition:UNIONOperatorCOMPUTEClauseFORBROWSEClauseOPTIONClause说明:SQLServer不支持Oracle的STARTWITH…CONNECTBY子句。在SQLServer中,你可以用创建一个执行同样任务的存储过程来代替。SQLServer不支持Oracle的INTERSECT和MINUS集合SQLServer的EXISTS和NOTEXISTS。子句可以完成同样的任务。下面的例子使用INTERSECT操作符来为所有有学生的班级找到课程代码和课程名称注意EXISTS。操作符是怎样代替INTERSECT操作符的。两者返回的数据是一样的。
    OracleSELECTCCODE,CNAMEFROMDEPT_ADMIN.CLASSINTERSECTSELECTC.CCODE,C.CNAMEFROMSTUDENT_ADMIN.GRADEG,DEPT_ADMIN.CLASSCWHEREC.CCODE=G.CCODE
    MicrosoftSQLServerSELECTCCODE,CNAMEFROMDEPT_ADMIN.CLASSCWHEREEXISTS(SELECTFROMSTUDENT_ADMIN.GRADEG'X'
    WHEREC.CCODE=G.CCODE)
     下例使用MINUS操作符来找出那些没有学生的班级。
    OracleSELECTCCODE,CNAMEFROMDEPT_ADMIN.CLASSMINUSSELECTC.CCODE,C.CNAMEFROMSTUDENT_ADMIN.GRADEG,DEPT_ADMIN.CLASSCWHEREC.CCODE=G.CCODE
    MicrosoftSQLServerSELECTCCODE,CNAMEFROMDEPT_ADMIN.CLASSCWHERENOTEXISTS(SELECTFROMSTUDENT_ADMIN.GRADEG'X'
    WHEREC.CCODE=G.CCODE)
    2.2插入语句语法比较Oracle和MicrosoftSQLServer用的INSERT语句的语法是类似的。2.2.1ORACLE的插入
    语句语法比较INSERTINTO{table_name|view_name|select_statement}[(column_list)]{values_list|select_statement}2.2.2SQLSERVER的插入语句语法比较Oracle和MicrosoftSQLServer用的INSERT语句的语法是类似的。INSERT[INTO]{table_name[[AS]table_alias]WITH([…n])|view_name[[AS]table_alias]|rowset_function_limited}
    {
    [(column_list)]DEFAULT
    {VALUES({||NULL
    expression
    }[,…n]
     )|derived_table|execute_statement}}|DEFAULTVALUES说明:Transact-SQL语言支持插入表和视图但是不支持SELECT语句中的INSERT操作如果你的Oracle,。程序这么做了,则必须修改。
    OracleINSERTCCODE,INTO(SELECTSSN,
    MicrosoftSQLServerINSERTCCODE,INTOGRADE(SSN,
    GRADEFROMGRADE)
    GRADE)
    VALUES('111111111','1111',NULL)
    VALUES('111111111','1111',NULL)
    Transact-SQL的values_list参数提供了SQL-92标准的关键字DEFAULT,但这个在Oracle中是不支持的。当执行插入操作的时候,这个关键字给出了要用到的列的缺省值。如果给定的列没有缺省值,则插入一个NULL。如果该列不允许NULL,则返回一个错误消息。关键字DEFAULT不能用于标识列。要产生下一个连续值,则有IDENTITY属性的列一定不能列入column_list或者values_clause。你不一定非要用DEFAUL关键字来获得一列的缺省值。在Oracle中,如果该列没有被column_list引用并且它有一个缺省值,则缺省值将放入列中。这是执行移植时最兼容的方法。一个有用的Transact-SQL选项(Executeprocedure_name)是执行一个过程并且用管道把它的输出值输出到一个目标表或者视图。Oracle不允许你这样做。
    2.3修改语句语法比较因为Transact-SQL支持Oracle的UPDATE绝大多数语法,所以只需要很小的修改。2.3.1ORACLE修改语句语法说明UPDATE{table_name|view_name|select_statement}
    SET[column_name(s)={constant_value|expression|select_statement|column_list|variable_list}{where_statement}2.3.2SQLSERVER修改语句语法说明
     UPDATE{table_name[[AS]table_alias]WITH([…n])view_name[[AS]table_alias]|rowset_function_limited}SET{column_name={expression|DEFAULT|NULL}|@variable=expression|@variable=column=expression}[,…n]{{[FROM{}[,…n]][WHERE]}|[WHERECURRENTOF{{[GLOBAL]cursor_name}|cursor_variable_name}]}[OPTION([,…n])]说明:Transact-SQL的UPDATE语句不支持依赖SELECT语句的更新操作。如果你的SqlServer程序这样做了,你可以把SELECT语句变成一个视图,然后在SQLServer的UPDATE语句中使用这个视图名字。请参看前面“INSERT”语句中的例子。Oracle的UPDATE命令只能使用一个PL/SQL块中的程序变量。Transact-SQL语言不要求在使用
    变量时使用块。
    OracleDECLAREVAR1NUMBER(10,2);BEGINVAR1:=2500;UPDATESTUDENT_ADMIN.STUDENT
    MicrosoftSQLServerDECLARE@VAR1NUMERIC(10,2)SELECT@VAR1=2500UPDATESTUDENT_ADMIN.STUDENTSETTUITION_TOTAL=@VAR1
    SETTUITION_TOTAL=VAR1;END;
    在SQLServer中,关键字DEFAULT可以用来把一列设置为它的缺省值。你不能用Oracle的UPDATE命令来设置一列为它的缺省值。Transact-SQL和OracleSQL都支持在一个UPDATE语句中使用子查询。但是Transact-SQL的FROM子句可以用来创建一个基于节点的UPDATE。这个能力是你的UPDATE语法更加可读并且在某种意义上提高了性能。
    OracleUPDATESTUDENT_ADMIN.STUDENTSSETTUITION_TOTAL=1500WHERESSNIN(SELECTSSNFROMGRADEGWHEREG.SSN=S.SSN
    MicrosoftSQLServerSubquery:UPDATESTUDENT_ADMIN.STUDENTSSETTUITION_TOTAL=1500WHERESSNIN(SELECTSSNFROMGRADEG
     ANDG.CCODE='1234')
    WHEREG.SSN=S.SSNANDG.CCODE='1234')FROMclause:UPDATESTUDENT_ADMIN.STUDENTSSETTUITION_TOTAL=1500FROMGRADEGWHERES.SSN=G.SSNANDG.CCODE='1234'
    2.4删除语句语法比较在大多数情况下,不需要修改DELETE语句。但是如果你在Oracle中执行依赖SELECT语句的删除操作,你就必须进行修改,因为在Transact-SQL不支持这种功能。Transact-SQL支持在WHERE子句中使用子查询FROM子句也一样后者可以产生更有效的语句,。。2.4.1ORACLE删除语句语法分析DELETE[FROM]{table_name|view_name|[WHEREclause]2.4.2SQLSERVER删除语句分析。DELETE[FROM]{table_name[[AS]table_alias]WITH([…n])|view_name[[AS]table_alias]|rowset_function_limited}[FROM{}[,…n]][WHERE{|{[CURRENTOF{{[GLOBAL]cursor_name}select_statement}
    cursor_variable_name}]}}[OPTION([,…n])]
    2.5truncate语句语法分析在Oracle和MicrosoftSQLServer中TRUNCATETABLE语句的语法是相似的TRUNCATETABLE。语句用来把一个表中的所有行清除掉,并且这个操作是不能后滚的。该表的结构和索引仍然存在。DELETE触发器不会被执行。如果该表被一个FOREIGNKEY引用,则该表不能被砍掉。2.5.1ORACLE数据库中使用TRUNCATE语句TRUNCATETABLEtable_name[{DROP|REUSE}STORAGE]2.5.2SQLSERVER数据库中使用TRUNCATE语句
     TRUNCATETABLEtable_name说明:在SQLServer中,这个语句只能由表的所有者给出。在Oracle中,只有当你是表的所有者或者有DELETETABLE系统特权时才能使用该语句。Oracle的TRUNCATETABLE命令可以随意的释放被表中的行占据的存储空间。SQLServer的TRUNCATETABLE则总是回收被表中的数据和与之关联的索引所占据的空间。
    2.6在IDENTITY和TIMESTAMP列中操作数据Oracle序列是一种和任何给定的表或者列都不直接相关的数据
    库对象。一列和一个序列的关系是在应用程序中实现的,方法是把一个序列的值分配给一个列。因此在同序列一起工作的时候,Oracle并没有强化任何规则。但是在MicrosoftSQLServer的标识列中,值是不能被更新的并且也不能使用DEFAULT关键字。缺省情况下,数据不能直接插入到一个标识列中。标识列为新插入表的每一行自动产生一个唯一的、顺序的数字。这个缺省设置可以用下面的SET语句覆盖。SETIDENTITY_INSERTtable_nameON当IDENTITY_INSERT设置为ON时,用户就可以在新行的标识列中插入任何值。为了防止输入重复的值,必须在该列上创建一个唯一的索引。这个语句的目的是允许用户为一行重新创建一个偶然被删除的值。@@IDENTITY可以用来获取最后一个标识值。TRUNCATETABLE语句把一个标识列重新设置为它原来的SEED值。如果你不想为一列重新设置标识值,可以用不带WHERE子句的DELETE子句来代替TRUNCATETABLE语句。你必须估计这会给你的Oracle移植带来什么样的影响,因为ORACLESEQUENCES不会跟着TRUNCATETABLE命令重新设置。对时间信息(timestamp)列,你只能执行插入或者删除操作。如果你试图更新一个时间信息列,你将收到这样的错误消息。Msg272,Level16,State1Can'tupdateaTIMESTAMPcolumn.
    2.7锁定被请求的行⑴Oracle用FORUPDATE子句来锁定在SELECT命令中指定的行。⑵在MicrosoftSQLServer中,你不需要使用它的等价子句,因为这是一个缺省行为。
    2.8行合计和计算子句SQLServer的COMPUTE子句用来生成行合计函数(SUM、AVG、MIN、MAX、以及COUNT),这些函数看起来好像是查询结果的附加行。这允许你看到一组结果的详情和汇总。你可以为一个子群(subgroups)计算汇总值,还可以为同一组计算更多的合计函数。Oracle的SELECT命令语法不支持COMPUTE子句。但是,SQLServer的COMPUTE子句就像在Oracle的SQL*Plus查询工具中能找到的COMPUTE命令一样的工作。
     2.9SQL语法在转换过程中遵循的标准⑴检查所有SELECT、INSERT、UPDATE、和DELETE语句是否有效。做任何需要的修改。⑵把所有的外部节点改为SQL-92外部节点语法⑶用适当的SQLServer函数代替Oracle函数⑷检查所有的比较操作符⑸用“+”代替“||”做字符串串联操作符。⑹用Transact-SQL程序代替PL/SQL程序⑺把所有的PL/SQL游标改为无游标SELECT语句或者Transact-SQL游标。⑻用Transact-SQL过程代替PL/SQL过程、函数和封装。⑼把PL/SQL触发器转换为Transact-SQL触发器。⑽使用SETSHOWPLAN语句来调试你的查询以获得高的性能。
    3应用对象:本文档主要对ORACLE和SQLSERVER在语法和函数方面进
    行了分析和比较,对形成和完善KMSQL将会起者促进作用。当然,本文档也有不完善之处,在今后的工作过程中,将会不断增加和完善。
    
    
设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师