Oracle和SQL_Server的語法區(qū)別_第1頁
Oracle和SQL_Server的語法區(qū)別_第2頁
Oracle和SQL_Server的語法區(qū)別_第3頁
Oracle和SQL_Server的語法區(qū)別_第4頁
Oracle和SQL_Server的語法區(qū)別_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、SQL 語言支持 這一部分概述了 Transact-SQL 和 PL/SQL 語言語法之間的相同點和不同點,并給出轉(zhuǎn)換策略。 要將 Oracle DML 語句和 PL/SQL 程序遷移到 SQL Server 時,請按下列步驟執(zhí)行: 1. 驗證所有 SELECT、INSERT、UPDATE 和 DELETE 語句的語法是有效的。進行任何必要的修改。 2. 把所有外部聯(lián)接改為 SQL-92 標(biāo)準(zhǔn)外部聯(lián)接語法。 3. 用相應(yīng) SQL Server 函數(shù)替代 Oracle 函數(shù)。 4. 檢查所有的比較運算符。 5. 用“+”字符串串聯(lián)運算符代替“|”字符串串聯(lián)運算符。 6. 用 Transact-S

2、QL 程序代替 PL/SQL 程序。 7. 把所有 PL/SQL 游標(biāo)改為非游標(biāo) SELECT 語句或 Transact-SQL 游標(biāo)。 8. 用 Transact-SQL 過程代替 PL/SQL 過程、函數(shù)和包。 9. 把 PL/SQL 觸發(fā)器轉(zhuǎn)換為 Transact-SQL 觸發(fā)器。 10. 使用 SET SHOWPLAN 語句,優(yōu)化查詢性能。 SELECT 語句Oracle 和 Microsoft SQL Server 使用的 SELECT 語句語法類似。 OracleMicrosoft SQL ServerSELECT /*+ optimizer_hints*/ ALL | DISTI

3、NCT select_listFROMtable_name | view_name | select_statementWHERE clause GROUP BY group_by_expressionHAVING search_conditionSTART WITH U CONNECT BYUNION | UNION ALL | INTERSECT |MINUS SELECT UORDER BY clauseFOR UPDATESELECT select_listINTO new_table_FROM table_sourceWHERE search_condition GROUP BY A

4、LL group_by_expression ,Un WITH CUBE | ROLLUP HAVING search_conditionORDER BY order_expression ASC | DESC In addition:UNION Operator COMPUTE ClauseFOR BROWSE ClauseOPTION ClauseSQL Server 不支持 Oracle 特定的基于開銷的優(yōu)化程序提示,它必須被刪除。建議使用的技術(shù)是,使用 SQL Server 基于開銷的優(yōu)化程序。有關(guān)詳細信息,請參見本章后面的“SQL 語句優(yōu)化”。 SQL Server 不支持 Orac

5、le 的 START WITHUCONNECT BY 子句。在 SQL Server 中,可以創(chuàng)建完成相同任務(wù)的存儲過程替代它。 SQL Server 不支持 Oracle 的 INTERSECT 和 MINUS 集合運算符。可使用 SQL Server EXISTS 和 NOT EXISTS 子句,實現(xiàn)相同的結(jié)果。 在下面示例中,使用 INTERSECT 運算符,用于查找學(xué)生登記的所有課程的代碼和名稱。注意,EXISTS 運算符是如何代替 INTERSECT 運算符的。返回的數(shù)據(jù)是相同的。 OracleMicrosoft SQL ServerSELECT CCODE, CNAMEFROM D

6、EPT_ADMIN.CLASSINTERSECTSELECT C.CCODE, C.CNAMEFROM STUDENT_ADMIN.GRADE G,DEPT_ADMIN.CLASS CWHERE C.CCODE = G.CCODESELECT CCODE, CNAMEFROM DEPT_ADMIN.CLASS CWHERE EXISTS(SELECT 'X' FROM STUDENT_ADMIN.GRADE GWHERE C.CCODE = G.CCODE)在此例中,使用 MINUS 運算符,查找那些沒有任何學(xué)生登記的課程。 OracleMicrosoft SQL Server

7、SELECT CCODE, CNAMEFROM DEPT_ADMIN.CLASSMINUSSELECT C.CCODE, C.CNAMEFROM STUDENT_ADMIN.GRADE G,DEPT_ADMIN.CLASS CWHERE C.CCODE = G.CCODESELECT CCODE, CNAMEFROM DEPT_ADMIN.CLASSCWHERE NOT EXISTS(SELECT 'X' FROM STUDENT_ADMIN.GRADE GWHERE C.CCODE = G.CCODE)INSERT 語句Oracle 和 Microsoft SQL Serve

8、r 使用的 INSERT 語句語法類似。 OracleMicrosoft SQL ServerINSERT INTOtable_name | view_name | select_statement (column_list)values_list | select_statementINSERT INTO table_name AS table_alias WITH ( <table_hint_limited> Un)| view_name AS table_alias| rowset_function_limited (column_list) VALUES ( DEFAULT

9、 | NULL| expression ,Un)| derived_table| execute_statement | DEFAULT VALUESTransact-SQL 語言支持對表和視圖的插入,但不支持對 SELECT 語句的 INSERT 操作。如果 Oracle 應(yīng)用程序代碼執(zhí)行對 SELECT 語句的插入操作,則必須對它進行修改。 OracleMicrosoft SQL ServerINSERT INTO (SELECT SSN, CCODE, GRADE FROM GRADE)VALUES ('111111111', '1111',NULL)IN

10、SERT INTO GRADE (SSN, CCODE, GRADE)VALUES ('111111111', '1111',NULL)Transact-SQL values_list 參數(shù)提供了 SQL-92 標(biāo)準(zhǔn)關(guān)鍵字 DEFAULT,但 Oracle 不支持。此關(guān)鍵字指定了,執(zhí)行插入操作時使用列的默認值。如果指定列的默認值不存在,則插入 NULL。如果該列不允許 NULL,則返回一個錯誤消息。如果該列數(shù)據(jù)類型定義為 timestamp,則插入下一個有序值。 標(biāo)識符列不能使用 DEFAULT 關(guān)鍵字。要生成下一個序列號,擁有 IDENTITY 屬性的列不能列

11、在 column_list 或 values_clause 中。不需使用 DEFAULT 關(guān)鍵字,來獲取列的默認值。正如在 Oracle 中,如果列沒有在 column_list 中引用,并且它有默認值,則默認值存放在列中。這是遷移時可使用的最兼容的方法。 一個有用的 Transact_SQL 選項 (EXECute procedure_name) 是,執(zhí)行一個過程并將其結(jié)果用管道輸出到目標(biāo)表或視圖中。Oracle 不允許這樣做。 UPDATE 語句因為 Transact SQL 支持 Oracle UPDATE 命令使用的絕大多數(shù)語法,所以只需要極少的修改。 OracleMicrosoft

12、SQL ServerUPDATEtable_name | view_name | select_statementSET column_name(s) = constant_value | expression | select_statement | column_list |variable_listwhere_statementUPDATE table_name AS table_alias WITH ( <table_hint_limited> Un)view_name AS table_alias| rowset_function_limited SET column_n

13、ame = expression | DEFAULT | NULL| variable = expression | variable = column = expression ,UnFROM <table_source> ,Un WHERE <search_condition> | WHERE CURRENT OF GLOBAL cursor_name | cursor_variable_name OPTION (<query_hint> ,Un )Transact-SQL UPDATE 語句不支持對 SELECT 語句的更新操作。如果 Oracle 應(yīng)

14、用程序代碼對 SELECT 語句進行更新,則可以把 SELECT 語句轉(zhuǎn)換成一個視圖,然后在 SQL Server UPDATE 語句中使用該視圖名稱。請參見前面“INSERT 語句”中的示例。 Oracle UPDATE 命令只能使用一個 PL/SQL 塊中的程序變量。要使用變量,Transact-SQL 語言并不需要使用塊。 OracleMicrosoft SQL ServerDECLAREVAR1 NUMBER(10,2);BEGINVAR1 := 2500;UPDATE STUDENT_ADMIN.STUDENTSET TUITION_TOTAL = VAR1;END;DECLAREV

15、AR1 NUMERIC(10,2)SELECT VAR1 = 2500UPDATE STUDENT_ADMIN.STUDENTSET TUITION_TOTAL=VAR1在 SQL Server 中,DEFAULT 關(guān)鍵字可用于將一列設(shè)為其默認值。但不能使用 Oracle UPDATE 命令,將一列設(shè)為默認值。 Transact-SQL 和 Oracle SQL 均支持在 UPDATE 語句中使用子查詢。但是,Transact-SQL FROM 子句可用來創(chuàng)建一個基于聯(lián)接的 UPDATE。這一功能使 UPDATE 語法可讀性更好,在某些情況下還能改善性能。 OracleMicrosoft SQ

16、L ServerUPDATE STUDENT_ADMIN.STUDENT SSET TUITION_TOTAL = 1500WHERE SSN IN (SELECT SSN FROM GRADE GWHERE G.SSN = S.SSNAND G.CCODE = '1234')Subquery:UPDATE STUDENT_ADMIN.STUDENT SSET TUITION_TOTAL = 1500WHERE SSN IN (SELECT SSN FROM GRADE GWHERE G.SSN = S.SSNAND G.CCODE = '1234')FROM

17、clause:UPDATE STUDENT_ADMIN.STUDENT SSET TUITION_TOTAL = 1500FROM GRADE GWHERE S.SSN = G.SSNAND G.CCODE = '1234'DELETE 語句在大多數(shù)情況下,不需要修改 DELETE 語句。如果要對 Oracle 中的 SELECT 語句執(zhí)行刪除操作,則必須修改 SQL Server 語法,因為 Transact-SQL 不支持這一功能。 Transact-SQL 支持在 WHERE 子句中使用子查詢,以及在 FROM 子句中使用聯(lián)接。后者可產(chǎn)生更有效的語句。請參見前面“UPDA

18、TE 語句”中的示例。 OracleMicrosoft SQL ServerDELETE FROMtable_name | view_name | select_statementWHERE clause DELETE FROM table_name AS table_alias WITH ( <table_hint_limited> Un)| view_name AS table_alias| rowset_function_limited FROM <table_source> ,Un WHERE <search_condition> | CURRENT

19、 OF GLOBAL cursor_name cursor_variable_name OPTION (<query_hint> ,Un)TRUNCATE TABLE 語句Oracle 和 Microsoft SQL Server 使用的 TRUNCATE TABLE 語句語法類似。TRUNCATE TABLE 用于從表中刪除所有的行,并且不能回滾。表結(jié)構(gòu)及其所有索引繼續(xù)存在。DELETE 觸發(fā)器不執(zhí)行。如果表被一個 FOREIGN KEY 約束引用,則它不能被截斷。 OracleMicrosoft SQL ServerTRUNCATE TABLE table_nameDROP |

20、 REUSE STORAGETRUNCATE TABLE table_name在 SQL Server 中,此語句只能由表的所有者執(zhí)行。在 Oracle 中,如果是表的所有者或擁有 DELETE TABLE 系統(tǒng)權(quán)限,就可以執(zhí)行此命令。 Oracle TRUNCATE TABLE 命令可以有選擇地釋放表中行所占用的存儲空間。SQL Server TRUNCATE TABLE 語句總是收回表數(shù)據(jù)及其相關(guān)索引所占用的空間。 標(biāo)識符列和時間戳列中數(shù)據(jù)的處理Oracle 序列是與任何給定的表或列均不直接相關(guān)的數(shù)據(jù)庫對象。列和序列之間的關(guān)系是在應(yīng)用程序中實現(xiàn)的,即通過編程的方法將序列值賦給列。因此,Or

21、acle 使用序列時,并不實施任何規(guī)則。但是,在 Microsoft SQL Server 標(biāo)識符列中,值不能被更新,并且不能使用 DEFAULT 關(guān)鍵字。 默認情況下,數(shù)據(jù)不能直接插入到標(biāo)識符列。標(biāo)識符列自動給表中插入的每個新行生成一個唯一的序列號。可以使用下列 SET 語句改寫這種默認設(shè)置: SET IDENTITY_INSERT table_name ON將 IDENTUTY_INSERT 設(shè)為 ON,用戶就可以向新行的標(biāo)識符列插入任何值。要防止出現(xiàn)有重復(fù)號碼的條目,必須為該列創(chuàng)建唯一索引。這條語句的目的是,允許用戶給無意中刪除的行重新創(chuàng)建一個值。IDENTITY 函數(shù)可用來獲取上一個標(biāo)

22、識值。 TRUNCATE TABLE 語句將標(biāo)識符列重置為其起始 SEED 值。如果不想重置列的標(biāo)識值,則不使用 TRUNCATE TABLE 語句,而使用不帶 WHERE 子句的 DELETE 語句。必須評估它對 Oracle 遷移造成的影響,因為 ORACLE SEQUENCE 在 TRUNCATE TABLE 命令之后不被重置。 處理 timestamp 列時,只能執(zhí)行插入和刪除。如果要更新一個 timestamp 列,會收到以下的錯誤信息: Msg 272, Level 16, State 1 Can't update a TIMESTAMP column.鎖定請求的行Orac

23、le 使用 FOR UPDATE 子句來鎖定 SELECT 命令中指定的行。不需要在 Microsoft SQL Server 中使用對等的子句,因為這是默認行為。 行合計和 COMPUTE 子句SQL Server COMPUTE 子句用于生成行合計函數(shù)(SUM、AVG、MIN、MAX 和 COUNT),它們在查詢結(jié)果中作為附加行出現(xiàn)。它允許查看一組結(jié)果的詳細和匯總信息行。可以計算子組的匯總值,以及計算同一組的多個合計函數(shù)。 Oracle SELECT 命令語法不支持 COMPUTE 子句。但是,SQL Server COMPUTE 子句與 Oracle SQL*Plus 查詢工具中的 CO

24、MPUTE 命令作用相似。 聯(lián)接子句Microsoft SQL Server 7.0 允許在一個聯(lián)接子句中最多可聯(lián)接 256 個表,包括臨時表和永久表。在 Oracle 中,則沒有聯(lián)接限制。 在 Oracle 中使用外部聯(lián)接時,外部聯(lián)接運算符 (+) 通常放在該聯(lián)接的子列(外鍵)旁邊。(+) 標(biāo)識了具有較少唯一值的列。情況一般是這樣,除非外鍵允許空值,在這種情況下,(+) 被放在父(PRIMARY KEY 或 UNIQUE 約束)列上。(+) 不能放在等號 (=) 兩邊。 在 SQL Server 中,可以使用 *= 和 =* 外部聯(lián)接運算符。* 用于標(biāo)識有較多唯一值的列。如果子(外鍵)列不允

25、許空值,則 * 放在等號的父(PRIMARY KEY 或 UNIQUE 約束)列一邊。* 的位置和 Oracle 完全相反。* 不能放在等號 (=) 兩邊。 *= 和 =* 被認為是舊式聯(lián)接運算符。SQL Server 也支持下面列出的 SQL-92 標(biāo)準(zhǔn)聯(lián)接運算符。建議使用這種語法。SQL-92 標(biāo)準(zhǔn)語法功能更強大,并且比 * 運算符的限制要少。 聯(lián)接操作說明CROSS JOIN這是兩個表的交叉乘積。它與舊式聯(lián)接中未指定 WHERE 子句而返回的行相同。在 Oracle 中,這種類型聯(lián)接稱為笛卡爾聯(lián)接。INNER這種聯(lián)接指定,所有內(nèi)部行均要返回。丟棄任何不匹配的行。這和標(biāo)準(zhǔn)的 Oracle

26、表聯(lián)接相同。LEFTOUTER 這種類型的聯(lián)接指定,所有左表的外部行均要返回,即使沒找到匹配的列,也就如此。這和 Oracle 外部聯(lián)接 (+) 的操作類似。RIGHTOUTER 這種類型的聯(lián)接指定,所有右表的外部行均要返回,即使沒找到匹配的列,也是如此。這和 Oracle 外部聯(lián)接 (+) 的操作類似。FULL OUTER如果兩個表中的一行不符合選擇標(biāo)準(zhǔn),則指定將這一行加到結(jié)果集中,并且將其對應(yīng)于另一表的輸出列設(shè)為 NULL。這和將 Oracle 外部聯(lián)接運算符放在“=”號兩邊 (col1(+)=col2(+) 的效果是一樣的,但后者在 Oracle 中是不允許的。 下面的代碼示例返回所有學(xué)

27、生登記的課程列表。外部聯(lián)接定義在學(xué)生 (student) 和成績 (grade) 表之間,成績表允許所有的學(xué)生出現(xiàn)在上面,甚至那些沒有登記任何課程的學(xué)生也是如此。外部聯(lián)接也加到課程表上,以返回課程名稱。如果外部聯(lián)接不加到課程表上,就不會返回那些沒有登記任何課程的學(xué)生,因為他們的課程代碼 (CCODE) 為空。 OracleMicrosoft SQL ServerSELECT S.SSN AS SSN,FNAME, LNAMEFROM STUDENT_ADMIN.STUDENT S,DEPT_ADMIN.CLASS C,STUDENT_ADMIN.GRADE GWHERE S.SSN = G.S

28、SN(+)AND G.CCODE = C.CCODE(+)SELECT S.SSN AS SSN,FNAME, LNAMEFROM STUDENT_ADMIN.GRADE GRIGHT OUTER JOINSTUDENT_ADMIN.STUDENT SON G.SSN = S.SSNLEFT OUTER JOINDEPT_ADMIN.CLASS CON G.CCODE = C.CCODE將 SELECT 語句做為表名使用Microsoft SQL Server 和 Oracle 均支持在執(zhí)行查詢時,把 SELECT 語句作為表的來源使用。SQL Server 需要一個別名;對 Oracle,別

29、名的使用是可選的。 OracleMicrosoft SQL ServerSELECT SSN, LNAME, FNAME,TUITION_PAID, SUM_PAIDFROM STUDENT_ADMIN.STUDENT,(SELECT SUM(TUITION_PAID) SUM_PAID FROM STUDENT_ADMIN.STUDENT)SELECT SSN, LNAME, FNAME,TUITION_PAID, SUM_PAIDFROM STUDENT_ADMIN.STUDENT,(SELECT SUM(TUITION_PAID) SUM_PAID FROM STUDENT_ADMIN.

30、STUDENT) SUM_STUDENT讀取和修改 BLOBMicrosoft SQL Server 使用 text 和 image 列,來實現(xiàn)二進制大型對象 (BLOB)。Oracle 使用 LONG 和 LONG RAW 列實現(xiàn) BLOB。在 Oracle 中,SELECT 命令可以查詢 LONG 和 LONG RAW 列中的值。 在 SQL Server 中,可以使用標(biāo)準(zhǔn)的 Transact-SQL 語句或?qū)iT的 READTEXT 語句讀取 text 和 image 列中的數(shù)據(jù)。READTEXT 語句允許讀取 text 或 image 列的部分片段。Oracle 沒有提供處理 LONG

31、和 LONG RAW 的對等語句。 READTEXT 語句使用 text_pointer,它可以用 TEXTPTR 函數(shù)獲得。TEXTPTR 函數(shù)返回一個指針,它指向指定行中的 text 或 image 列,或如果返回不止一行,則它指向查詢返回的最后一行的 text 或 image 列。因為 TEXTPTR 函數(shù)返回一個 16 字節(jié)的二進制字符串,最好聲明一個局部變量來存放文本指針,然后由 READTEXT 使用該變量。 READTEXT 語句指定要返回的字節(jié)數(shù)。TEXTSIZE 函數(shù)中的值是要返回的字符或字節(jié)數(shù)的限度,如果它小于 READTEXT 指定的大小,就會替代 READTEXT 語句

32、指定值。 可使用帶 TEXTSIZE 參數(shù)的 SET 語句,指定 SELECT 語句返回的文本數(shù)據(jù)的大小(字節(jié)數(shù))。如果指定 TEXTSIZE 為 0,其大小被重置為默認值 (4 KB)。設(shè)置 TEXTSIZE 參數(shù),會影響 TEXTSIZE 函數(shù)。當(dāng) SQL_MAX_LENGTH 語句選項更改時,SQL Server ODBC 驅(qū)動程序就會自動設(shè)置 TEXTSIZE 參數(shù)。 在 Oracle 中,UPDATE 和 INSERT 命令用于更改 LONG 和 LONG RAW 列中的值。在 SQL Server 中,可以使用標(biāo)準(zhǔn)的 UPDATE 和 INSERT 語句,也可以使用 UPDATET

33、EXT 和 WRITETEXT 語句。UPDATETEXT 和 WRITETEXT 均允許無日志記錄的選項,并且 UPDATETEXT 允許對 text 或 image 列進行部分更新。 UPDATETEXT 語句可用于替換現(xiàn)有數(shù)據(jù)、刪除現(xiàn)有數(shù)據(jù)或插入新數(shù)據(jù)。新插入的數(shù)據(jù)可以是常量、表名、列名或文本指針。 WRITETEXT 語句可完全覆蓋受其影響的列中的任何現(xiàn)有數(shù)據(jù)。使用 WRITETEXT 可替換文本數(shù)據(jù);使用 UPDATETEXT 可修改文本數(shù)據(jù)。UPDATETEXT 語句更加靈活,因為它只更改一部分文本或圖像值,而不是更改全部。 有關(guān)詳細信息,請參見 SQL Server Books

34、Online。 本節(jié)中的表給出了 Oracle 和 SQL Server 標(biāo)量值函數(shù)和合計函數(shù)之間的關(guān)系。盡管名稱看起來是相同的,但要注意,函數(shù)參數(shù)的數(shù)量和類型是不同的,這一點非常重要。此外,在這個列表中,沒有給出僅由 Microsoft SQL Server 提供的函數(shù),因為本章僅限于講述,如何方便地實現(xiàn)從現(xiàn)有 Oracle 應(yīng)用程序的遷移。Oracle 不支持函數(shù)的例子有:角度 (DEGREES)、圓周率 (PI) 和隨機數(shù) (RAND)。 數(shù)字/數(shù)學(xué)函數(shù)下面是 Oracle 支持的數(shù)字/數(shù)學(xué)函數(shù)及其 Microsoft SQL Server 對等函數(shù)。 函數(shù)OracleMicrosoft

35、 SQL Server絕對值A(chǔ)BSABS反余弦ACOSACOS反正弦ASINASINn 的反正切ATANATANm/n 的反正切ATAN2ATN2>=值的最小整數(shù) CEILCEILING余弦COSCOS雙曲余弦COSHCOT指數(shù)值EXPEXP<=值的最大整數(shù)FLOORFLOOR自然對數(shù)LNLOG以任何為底的對數(shù)LOG(N)暫缺以 10 為底的對數(shù)LOG(10)LOG10模數(shù)(余數(shù))MODUSE MODULO (%) OPERATOR冪POWERPOWER隨機數(shù)暫缺RAND舍入ROUNDROUND數(shù)的符號SIGNSIGN正弦SINSIN雙曲正弦SINH暫缺平方根SQRTSQRT正切T

36、ANTAN雙曲正切TANH暫缺截尾TRUNC暫缺列表中的最大數(shù)GREATEST暫缺列表中的最小數(shù)LEAST暫缺如果為 NULL,轉(zhuǎn)換成數(shù)字NVLISNULL字符函數(shù)下面是 Oracle 支持的字符函數(shù)及其 Microsoft SQL Server 對等函數(shù)。 函數(shù)OracleMicrosoft SQL Server把字符轉(zhuǎn)換成 ASCIIASCIIASCII字符串串聯(lián)CONCAT(表達式 + 表達式)把 ASCII 轉(zhuǎn)換成字符CHRCHAR返回字符串中的起始字符(從左)INSTRCHARINDEX將字符轉(zhuǎn)換成小寫LOWERLOWER將字符轉(zhuǎn)換成大寫UPPERUPPER在字符串的左邊填充字符LP

37、AD暫缺刪除前導(dǎo)空格LTRIMLTRIM刪除尾空格RTRIMRTRIM字符串中模式的起始點INSTRPATINDEX多次重復(fù)字符串RPADREPLICATE字符串的語音表示SOUNDEXSOUNDEX重復(fù)空格的字符串RPADSPACE從數(shù)字數(shù)據(jù)轉(zhuǎn)換而來的字符數(shù)據(jù)TO_CHARSTR子串SUBSTRSUBSTRING字符替換REPLACESTUFF字符串中每個詞的第一個字母大寫INITCAP暫缺字符串轉(zhuǎn)換TRANSLATE暫缺字符串長度LENGTHDATELENGTH 或 LEN列表中的最大字符串GREATEST暫缺列表中的最小字符串LEAST暫缺如果為 NULL,則轉(zhuǎn)換字符串NVLISNULL

38、日期函數(shù)下面是 Oracle 支持的日期函數(shù)及其 Microsoft SQL Server 對等函數(shù)。 函數(shù)OracleMicrosoft SQL Server日期加(日期列 +/- 值)或 ADD_MONTHSDATEADD日期間的間隔(日期列 +/- 值)或 MONTHS_BETWEENDATEDIFF當(dāng)前日期和時間SYSDATEGETDATE()月的最后一天LAST_DAY暫缺時區(qū)轉(zhuǎn)換NEW_TIME暫缺該日期后的第一個工作日NEXT_DAY暫缺日期的字符串表示TO_CHARDATENAME日期的整數(shù)表示TO_NUMBER (TO_CHAR)DATEPART日期舍入ROUNDCONVER

39、T日期截尾TRUNCCONVERT字符串轉(zhuǎn)換為日期TO_DATECONVERT如果為 NULL,則轉(zhuǎn)換日期NVLISNULL轉(zhuǎn)換函數(shù)下面是 Oracle 支持的轉(zhuǎn)換函數(shù)及其 Microsoft SQL Server 對等函數(shù)。 函數(shù)OracleMicrosoft SQL Server數(shù)字到字符TO_CHARCONVERT字符到數(shù)字TO_NUMBERCONVERT日期到字符TO_CHARCONVERT字符到日期TO_DATECONVERT十六進制到二進制HEX_TO_RAWCONVERT二進制到十六進制RAW_TO_HEXCONVERT其它行級函數(shù)下面是 Oracle 支持的其它行級函數(shù)及其 M

40、icrosoft SQL Server 對等函數(shù)。 函數(shù)OracleMicrosoft SQL Server返回第一個非空表達式DECODECOALESCE當(dāng)前序列值CURRVAL暫缺下一個序列值NEXTVAL暫缺如果表達式 1 = 表達式 2,則返回空DECODENULLIF用戶的登錄 ID 號UIDSUSER_ID用戶的登錄名USERSUSER_NAME用戶的數(shù)據(jù)庫 ID 號UIDUSER_ID用戶的數(shù)據(jù)庫名USERUSER_NAME當(dāng)前用戶CURRENT_USERCURRENT_USER用戶環(huán)境(審核記錄)USERENV暫缺CONNECT BY 子句的級別LEVEL暫缺合計函數(shù)下面是 O

41、racle 支持的合計函數(shù)及其 Microsoft SQL Server 對等函數(shù)。 函數(shù)OracleMicrosoft SQL Server平均值A(chǔ)VGAVG計數(shù)COUNTCOUNT最大值MAXMAX最小值MINMIN標(biāo)準(zhǔn)偏差STDDEVSTDEV 或 STDEVP匯總SUMSUM方差VARIANCEVAR 或 VARP條件測試Oracle DECODE 語句和 Microsoft SQL Server CASE 表達式都執(zhí)行條件測試。當(dāng) test_value 中的值符合下列任何表達式時,就會返回相關(guān)的值。如果不符合,則返回 default_value。如果沒有指定 default_valu

42、e,且不符合任何表達式,則 DECODE 和 CASE 返回 NULL。下表給出了語法以及一個轉(zhuǎn)換的 DECODE 命令的示例。 OracleMicrosoft SQL ServerDECODE (test_value,expression1, value1,expression2, value2 U,default_value)CREATE VIEW STUDENT_ADMIN.STUDENT_GPA(SSN, GPA)AS SELECT SSN, ROUND(AVG(DECODE(grade,'A', 4,'A+', 4.3,'A-', 3.

43、7,'B', 3,'B+', 3.3,'B-', 2.7,'C', 2,'C+', 2.3,'C-', 1.7,'D', 1,'D+', 1.3,'D-', 0.7,0),2)FROM STUDENT_ADMIN.GRADEGROUP BY SSNCASE input_expressionWHEN when_expression THEN result_expressionWHEN when_expression THEN result_express

44、ion .ELSE else_result_expressionENDCREATE VIEW STUDENT_ADMIN.STUDENT_GPA(SSN, GPA)AS SELECT SSN, ROUND(AVG(CASE gradeWHEN 'A' THEN 4WHEN 'A+' THEN 4.3WHEN 'A-' THEN 3.7WHEN 'B' THEN 3WHEN 'B+' THEN 3.3WHEN 'B-' THEN 2.7WHEN 'C' THEN 2WHEN '

45、C+' THEN 2.3WHEN 'C-' THEN 1.7WHEN 'D' THEN 1WHEN 'D+' THEN 1.3WHEN 'D-' THEN 0.7ELSE 0END),2)FROM STUDENT_ADMIN.GRADEGROUP BY SSNCASE 表達式可以支持使用 SELECT 語句進行布爾測試,這是 DECODE 命令所不允許的。有關(guān) CASE 表達式的詳細信息,請參見 SQL Server Books Online。 將值轉(zhuǎn)換為不同的數(shù)據(jù)類型Microsoft SQL Server CONVER

46、T 和 CAST 函數(shù)均是多用途的轉(zhuǎn)換函數(shù)。它們提供了相似的功能,把一種數(shù)據(jù)類型的表達式轉(zhuǎn)換為另一種數(shù)據(jù)類型,并支持多種特殊的數(shù)據(jù)格式: · CAST(expression AS data_type) · CONVERT (data type(length), expression , style) CAST 是一個 SQL-92 標(biāo)準(zhǔn)函數(shù)。這些函數(shù)執(zhí)行與 Oracle TO_CHAR、TO_NUMBER、TO_DATE、HEXTORAW 和 RAWTOHEX 函數(shù)相同的操作。 數(shù)據(jù)類型是指該表達式要轉(zhuǎn)換成為的任何系統(tǒng)數(shù)據(jù)類型。不能使用用戶定義的數(shù)據(jù)類型。length 參數(shù)

47、是可選的,它與 char、varchar、binary 和 varbinary 數(shù)據(jù)類型一起使用??稍试S的最大長度是 8000。 轉(zhuǎn)換OracleMicrosoft SQL Server字符到數(shù)字TO_NUMBER('10')CONVERT(numeric, '10')數(shù)字到字符TO_CHAR(10)CONVERT(char, 10)字符到日期TO_DATE('04-JUL-97')TO_DATE('04-JUL-1997', 'dd-mon-yyyy')TO_DATE('July 4, 1997'

48、, 'Month dd, yyyy')CONVERT(datetime, '04-JUL-97')CONVERT(datetime, '04-JUL-1997')CONVERT(datetime, 'July 4, 1997')日期到字符TO_CHAR(sysdate)TO_CHAR(sysdate, 'dd mon yyyy')TO_CHAR(sysdate, 'mm/dd/yyyy')CONVERT(char, GETDATE()CONVERT(char, GETDATE(), 106)CONV

49、ERT(char, GETDATE(), 101)十六進制到二進制HEXTORAW('1F')CONVERT(binary, '1F')二進制到十六進制RAWTOHEX(binary_column)CONVERT(char, binary_column)注意,字符串是如何轉(zhuǎn)換成日期的。在 Oracle 中,默認的日期格式模型為“DD-MON-YY”。如果使用任何其它格式,必須提供相應(yīng)的日期格式模型。CONVERT 函數(shù)自動轉(zhuǎn)換標(biāo)準(zhǔn)日期格式,而無須格式模型。 當(dāng)把日期轉(zhuǎn)換成字符串時,CONVERT 函數(shù)默認輸出為“dd mon yyyy hh:mm:ss:mmm(

50、24h)”。一種數(shù)字類型的編碼用于設(shè)定到其它日期格式模型輸出的格式。有關(guān) CONVERT 函數(shù)的詳細信息,請參見 SQL Server Books Online。 下表給出了 Microsoft SQL Server 日期的默認輸出。 不帶世紀帶有世紀標(biāo)準(zhǔn)輸出-0 或 100 (*) 默認mon dd yyyy hh:miAM(或 PM)1101美國mm/dd/yy2102ANSI3103英國/法國dd/mm/yy4104德國5105意大利dd-mm-yy6106-dd mon yy7107-mon dd, yy8108-hh:mm:ss-9 或 109 (*) 默認毫秒mon dd yyyy

51、 hh:mi:ss:mmm(AM 或 PM)10110美國mm-dd-yy11111日本yy/mm/dd12112ISOyymmdd-13 或 113 (*) 歐洲默認 dd mon yyyy hh:mm:ss:mmm(24h)14114-hh:mi:ss:mmm(24h)用戶定義的函數(shù)Oracle PL/SQL 函數(shù)可用于 Oracle SQL 語句中。在 Microsoft SQL Server 中,這一功能通常以其它方式實現(xiàn)。 在下面的示例中,Oracle 用戶定義的函數(shù) GET_SUM_MAJOR 用于獲取按專業(yè) (major) 交納的學(xué)費總和。在 SQL Server 中,可通過把查

52、詢作為表使用,以替代這一函數(shù)。 OracleMicrosoft SQL ServerSELECT SSN, FNAME, LNAME, ) TUITION_PAID,TUITION_PAID/GET_SUM_MAJOR(MAJOR)AS PERCENT_MAJORFROM STUDENT_ADMIN.STUDENTSELECT SSN, FNAME, LNAME, TUITION_PAID, TUITION_PAID/SUM_MAJOR AS PERCENT_MAJORFROM STUDENT_ADMIN.STUDENT,(SELECT MAJOR, SUM(TUITION_PAID) SUM

53、_MAJORFROM STUDENT_ADMIN.STUDENTGROUP BY MAJOR) SUM_STUDENTWHERE STUDENT.MAJOR = SUM_STUDENT.MAJORCREATE OR REPLACE FUNCTION GET_SUM_MAJOR(INMAJOR VARCHAR2) RETURN NUMBERAS SUM_PAID NUMBER;BEGINSELECT SUM(TUITION_PAID) INTO SUM_PAIDFROM STUDENT_ADMIN.STUDENTWHERE MAJOR = INMAJOR;RETURN(SUM_PAID);END

54、 GET_SUM_MAJOR;不需要 CREATE FUNCTION 語法;使用 CREATE PROCEDURE 語法。Oracle 和 Microsoft SQL Server 比較運算符幾乎是相同的。 運算符OracleMicrosoft SQL Server等于(=)(=)大于(>)(>)小于(<)(<)大于或等于 (>=)(>=)小于或等于(<=)(<=)不等于(!=, <>, =)(!=, <>, =)不大于,不小于暫缺!> , !<在集合的任何成員中ININ不在集合的任何成員中NOT INNOT

55、IN集合中的任一值A(chǔ)NY, SOMEANY, SOME引用集合中的所有值!= ALL, <> ALL, < ALL,> ALL, <= ALL, >= ALL, != SOME, <> SOME, < SOME, > SOME, <= SOME, >= SOME!= ALL, <> ALL, < ALL,> ALL, <= ALL, >= ALL, != SOME, <> SOME, < SOME, > SOME, <= SOME, >= SOME與模式相似LIKELIKE與模式不相似NOT LIKENOT LIKEx 和 y 之間的值BETWEEN x AND yBETWEEN x AND y不在兩者之間的值_NOT BETWEENNOT BETWEEN值存在EXISTSEXISTS值不存在NOT EXISTSNOT EXISTS值為|不為 NULLIS NULL, IS NOT NULL相同。也可以使用 = NULL、!=NULL,用于向

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論