ASE与Oracle差异Word格式文档下载.docx
- 文档编号:21179796
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:67
- 大小:128.85KB
ASE与Oracle差异Word格式文档下载.docx
《ASE与Oracle差异Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ASE与Oracle差异Word格式文档下载.docx(67页珍藏版)》请在冰豆网上搜索。
BINARY_DOUBLE
DATE
DATETIME
Datatime的数值可以精确到1/300秒,前提是所在的平台必须也要能支持到这一粒度,存储的时间是从1753/1/1到9999/12/31
TIMESTAMP
DATETIME
DATEDATE
可以存储的时间范围是0001/1/1到9999/12/31。
占用4个字节的存储空间
SMALLDATETIME
可以存储的时间范围是1900/1/1到2079/6/6,可以精确到分钟。
占用4个字节存储
TIME
Time存储的范围是00:
00:
000and23:
59:
999
TIMESTAMP
Datetime的值可以精确到1/300秒
CLOB
Text
Text是一个变长的字段,它可以存储存储2,147,483,647(2^31-1)字节的可打印字符。
BLOB
Image
Image是一个可变长的字段,它可以存储2,147,483,647(2^31-1)字节的裸数据。
LONG
TEXT
tText是一个变长的字段,它可以存储存储2,147,483,647(2^31-1)字节的可打印字符。
RAW(n)
VARBINARY(n)
IMAGE
BFILE
不支持
3.SQL语言差异
下面是关于两种SQL语言差异的列表和实例:
Oracle
Sybase
转换
#
代码
翻译
操作
常规
1
/
GO
搜索“/”并替换为“GO”
这个"
/"
包含在SQL命令的结尾。
它等价于Sybase的GO命令。
2
SQL中的分号(;
)
用空格全局替换之。
搜索并替换
3
变量的定义
比如:
x:
=表达式
SELECT@x=表达式
手工修改
4
参数名的转换
在Sybase中需变量前增加“@”符号。
如果Oracle的变量长度是30个字符,可能会带来Sybase的30个字符长度限制的问题。
替换或手工修改
5
select…into变量
这是Oracle中将选择出来的数据赋给宿主语言的变量。
使用Sybase的语法:
select@variable1=col1,@veriable2=col2…
6
常数
检查其使用的范围(局部/全局)然后将其定义为变量
7
%TYPE
寻找Oracle数据类型域的定义,然后用代码还原
手工重新编码
8
%ROWTYPE
将每个域分别按单独的变量编码.
9
ISRECORDOF
手工编码转换
10
ISTABLEOF
使用临时表,然后使用FETCH或SELECT处理每一行。
重新设计代码以使用游标查询临时表来处理数据行
11
ORACLE的调用dbms
重新编码以使用Sybase的函数,比如RAISEERROR或PRINT和其他Sybase系统存储过程
12
动态SQL
使用SybaseT-SQL重新编码。
13
使用缺省值
例如:
blood_type_char:
='
O'
使用“=”。
@blood_group_char='
14
EXITWHENnDbedDone=1ANDnAWMSDone=1;
将其转换成一个表达式,然后将其值作为If的条件,并使用T-SQL语句BREAK或RETURN确定程序的执行流程
15
INITCAP
将其转换成存储过程或OpenClient/OpenServer的应用程序。
16
SEQUENCE或CREATESEQUENCE
CREATESEQUENCEtest_seqMINVALUE1
STARTWITH1
INCREMENTEDby1
CACHE20;
INSERTINTOm_tabbleVALUES(test_seq.nextval,…)
设置一个关键值表,然后定义存储过程来模拟ORACLE中的NEXTVAL功能。
CREATETABLEmy_seq(seqint)
go
INSERTINTOmy_seqselect0
CREATEPROCEDUREget_seq(@seqint
OUTPUT)
AS
UPDATEmy_seqSETseq=seq+1
SELECT@seq=seqFROMmy_seq
DECLARE@seqint
EXECget_seq@seqOUTPUT
INSERTINTOm_tableVALUES(@seq,…)
Go
手工重新编码,将会带来schema的变化
17
synonym
用database.table.column_name手工重新编码,使之为每个字段所引用。
18
TYPEAccountingRecISRECORD
手工对每个域编码,使其那为一个变量
19
UNION
20
userenv('
sessionid'
master..sysprocesses中的kernelpid唯一标识了每个会话的ID。
使用这样等价的语句:
selectkpidfrommaster..sysprocesseswherestatus='
running'
21
局部和全局变量的处理
可能会在存储过程中使用局部变量,它们的值可以被传递到调用者或被调用者中。
在那些需要将package转换那各自分离的存储过程时,使用的局部或全局变量可能会涉及修改成特殊的代码。
22
用户自定义的函数
使用Sybase存储过程。
EXECUTE命令用于运行存储过程。
在ASE15.0.2可以支持用户自定义的函数。
23
IS
在存储过程中定义,转换成AS
替换
24
存储过程中的NUMBER类型
使用NUMERIC(10)
25
PackagesandProcedures
PrivateandPublic
尽可能地将Package转换成各自单一的存储过程。
26
触发器(之前触发器)
可以在Sybase中使用"
规则(rule)"
对确定的列设定可接受的数据条件。
27
RETURNBOOLEAN
由于boolean不是一个整数表达式,它不允许作为SybaseRETURN语句的一个参数。
所以将其转换成一个整数表达式(0,1):
@falseinteger=1并且@true
interger=0;
因此存储过程应该返回@false或@true.
操作符
串联操作符
||
“+”
将“||”替换成“+”
Sybase支持字符串的串联操作。
操作符是”+“
取模运算
MOD
%
比较操作
IFrAcct.AuthNumISNULL
THEN....BEGIN..END
E.gIFVARISNULL
Or
IFVARISNOTNULL
评估代码并将NULL转换成ISNULL或NOTNULL。
可能会在schema级涉及列定义的修改。
IF@VAR=NULL
IF@VAR!
=NULL
手工重新编码并可能会有schema的修改
函数
系统函数
CEIL
返回大于或等于指定值的最小整数。
CEILING
TRUNC
CONVERT(INT,…)
字符串函数
SUBSTR()
SUBSTRING()
LENGTH()
CHAR_LENGTH()
CHR()
CHAR()
TO_CHAR
CONVERT
TO_NUMBER
CONVERT(NUMERIC(n,n),field)
转换字符到数字
有用户自定义的字符转换到数字的程序。
可以用Sybase函数(convert(decimal(x,y),“string”)来替换。
对于可能有千年问题的应用,设置X=18,Y=9
替换并手工重新编码
日期函数
DATE函数和日期计算
转换成Sybase的日期处理程序。
Sybase支持大量的日期和时间处理函数,比如DATEADD,
DATEDIFF,DATEPART(),DATENAME(),timestamp等等。
LAST_DAY
转换到Sybase的存储过程或OpenClient/OpenServer程序
SYSDATE,SYSTIMESTAMP
使用GETDATE()和正确的格式
DATE和TIMESTAMP函数
在一些情况下用局部变量代替,或者可以重新架构使用Sybase的用户自定义数据类型TIMESTAMP.
TRUNC(dstartdate)
使用Sybase的CONVERT并使之返回带有00:
00小时格式的日期
转换函数
NVL
用ISNULL替换
NVL2
E.gNVL2(salary,salary*2,0)
CASE表达式,例如:
CASE
WHENsalary=NULLTHEN0
ELSEsalary*2
END
条件函数
DECODE,用于代替'
if-else'
的逻辑
转换到Sybase的case表达式。
SELECTSTUDENT_ID,
(CASEWHENCOURSE_ID=101THEN1
ELSE0END)ASCOURSE_101,
(CASEWHENCOURSE_ID=105THEN1
ELSE0END)ASCOURSE_105,
(CASEWHENCOURSE_ID=201THEN1
ELSE0END)ASCOURSE_201,
(CASEWHENCOURSE_ID=210THEN1
ELSE0END)ASCOURSE_210,
(CASEWHENCOURSE_ID=300THEN1
ELSE0END)ASCOURSE_300
GROUPBYSTUDENT_ID
ORDERBYSTUDENT_ID
连接(join)
col1=col2(+)
或
col1(+)=col2
转换到SybaseT-SQL:
col1=*col2
col2*=col1)
游标
CURSOR的使用
转换CURSOR的定义代码到Sybase的代码
CURSOR的一些操作选项
%ISOPEN,%NOTFOUND,
%FOUND,%ROWCOUNT
使用@@rowcount和@@sqlstatus全局变量
程序流的控制
IFexpressionTHEN
statement;
ENDIF;
IFexpression
statement
当statement有多条语句时,使用BEGIN和END作为该语句块的标识符。
EXIT;
BREAK
LOOPandENDLOOP
转换到T-SQL语句WHILE,CONTINUE,GOTO和IF-ELSE
错误处理
SQLCODE
"
@@error
一般错误的处理
通过Sybase的系统函数监测错误的条件。
加入代码以处理异常和错误。
WHENTOO_MANY_ROWS
THEN(ErrorHandling)
通过Sybase的@@rowcount监测TOO_MANY_ROWS,然后加入错误处理代码。
WHENNO_DATA_FOUND
通过Sybase的@@rowcount监测,然后加入错误处理代码。
诸如EXCEPTION的错误处理
用Sybase的错误和消息处理代替
cursor_already_open,
dup_val_on_index,
invalid_cursor,
invlaid_number,login_denied,
no_data_found,
not_logged_on,
program_error,storage_error,
timeout_on_resource,
too_many_rows,
transaction_backed_out,
value_error,zero_divide.
WHENDUP_VAL_ON_INDEX
THENEXCEPTION
根据INSERT或其他命令返回的错误代码判断。
对于这种类型的错误,增加错误处理代码。
PRAGMAandotherOracle
compilerdirectives
RAISE_APPLICATION_ERROR
(-20300,'
TaskhasnoReason
Codesupplied'
);
在Sybase有几种方法可以处理。
最简便的方法是使用EAISEERROR或PRINT命令打印出错误消息文本。
其他的方法是创建系统消息并将其链接到逻辑条件中。
SQL差异的举例:
字符串的处理:
oracle="
SUBSTR(phone,1,3)ASAREA_CODE"
sybase="
SUBSTRING(phone,1,3)ASAREA_CODE"
(first_name||'
'
||mi_name||'
||last_name)asname"
(first_name+'
+mi_name+'
+last_name)asname"
数字的处理:
SELECTstudent_id='
100'
(acceptable,butnotagoodidea)
SELECTstudent_id=100"
LTRIM(RTRIM(TO_CHAR(course_ceu,'
999D99'
)))"
RTRIM(CONVERT(CHAR,ROUND(course_ceu,2))))"
LTRIM(RTRIM(TO_CHAR(COURSE_CEU,'
999'
RTRIM(CONVERT(CHAR,CONVERT(INT,COURSE_CEU))))"
(notROUND)
控制结构:
oracle=LOOP
monthly_value:
=daily_value*31;
EXITWHENmonthly_value>
4000;
ENDLOOP;
Sybase=WHILE@monthly_value<
=4000
SELECT@monthly_value=@daily_value*31
Oracle=FORiIN1..5
…
Sybase=DECLARE@lbint,@ubint,@i
SELECT@lb=1,@i=@lb,@ub=5
WHILE@i<
=@ub
BEGIN
SELECT@i=@i+1
存储过程:
执行一个存储过程:
Oracle=Result:
=proc_name(param1=>
NAME,param2=>
value);
Sybase=EXEC@Result=proc_name@param1=@NAME,@param2=@valueoutput
日期的处理:
oracle="
TO_CHAR(start_date,'
FMHH12FM:
MIPM'
)"
sybase="
SUBSTRING(RTRIM(CONVERT(CHAR,start_date,0)),13,8)"
TO_CHAR(sysdate,'
mm/yy'
)"
SUBSTRING(RTRIM(CONVERT(CHAR,GETDATE(),3)),4,5)"
SELECTadd_months(xyz,3)FROMdual
SELECTDATEADD(month,3,xyz)FROMdual"
credit_expiration_date=last_day(TO_DATE('
+cc_date+"
'
))"
credit_expiration_date=CONVERT(DATETIME,"
sybase+="
RTRIM(CONVERT(CHAR,"
+s_month+"
))+'
/'
+"
RTRIM(CONVERT(CHAR,DATEDIFF(DAY,"
))+"
/1/'
+RTRIM(CONVERT(CHAR,"
+nYear+"
)),"
DATEADD(MONTH,1,"
))))))+"
)))"
其他:
oracle=DECLARECOUNTINT;
SELECTCOUNT()intoCOUNTFROMXYZ;
END;
sybase=declare@COUNYint
SELECT@COUNT=COUNT(*)FROMXYZ
SELECTNULLasstart_date"
SELECTCONVERT(DATETIME,NULL)asstart_date"
SELECT'
asstart_date"
(better)
SELECTNULLascourse_id"
SELECTCONVERT(INT,NULL)ascourse_id"
SELECT0ascourse_id"
SELECTNULLasfirst_name"
SELECTCONVERT(CHAR,NULL)asfirst_name"
asfirst_name"
外连接的语法:
student.student_id=student_company.student_id(+)"
student.student_id*=student_company.student_id"
student_company.student_id(+)=student.student_id"
student_company.student_id=*student.student_id"
限制:
SybaseASE不允许在一个已经有外连接的表上再作一个其他的连接(example#1)。
另外,如果执行带有一个外连接的查询,它的结果集列
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASE Oracle 差异