溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ORACLE 系統(tǒng)函數(shù)與SQLSERVER系統(tǒng)函數(shù)的區(qū)別是什么

發(fā)布時(shí)間:2021-03-17 14:40:36 來源:億速云 閱讀:169 作者:Leah 欄目:數(shù)據(jù)庫

這篇文章給大家介紹ORACLE 系統(tǒng)函數(shù)與SQLSERVER系統(tǒng)函數(shù)的區(qū)別是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

字符函數(shù)

函數(shù) Oracle Microsoft SQL Server 

把字符轉(zhuǎn)換為ASCII :ASCII ASCII
字串連接: CONCAT --------------(expression + expression)
把ASCII轉(zhuǎn)換為字符 CHR, CHAR
返回字符串中的開始字符(左起) INSTR ,---------------CHARINDEX
把字符轉(zhuǎn)換為小寫 LOWER ---------------------LOWER
把字符轉(zhuǎn)換為大寫 UPPER-------------------- UPPER
填充字符串的左邊 LPAD --------------------N/A
清除開始的空白 LTRIM--------------------LTRIM
清除尾部的空白 RTRIM --------------------RTRIM
字符串中的起始模式(pattern) INSTR --------------------PATINDEX
多次重復(fù)字符串 RPAD --------------------REPLICATE
字符串的語音表示 SOUNDEX --------------------SOUNDEX
重復(fù)空格的字串 RPAD --------------------SPACE
從數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換為字符數(shù)據(jù) TO_CHAR --------------------STR
子串 SUBSTR --------------------SUBSTRING
替換字符 REPLACE --------------------STUFF
將字串中的每個(gè)詞首字母大寫 INITCAP --------------------N/A
翻譯字符串 TRANSLATE --------------------N/A
字符串長度 LENGTH-------------------- DATELENGTH or LEN
列表中最大的字符串 GREATEST-------------------- N/A
列表中最小的字符串 LEAST --------------------N/A
如果為NULL則轉(zhuǎn)換字串 NVL-------------------- ISNULL

日期函數(shù)

下面是Oracle支持的日期函數(shù)和它們的Microsoft SQL Server等價(jià)函數(shù)。

函數(shù) Oracle --------------------Microsoft SQL Server
日期相加 (date column +/- value) or ADD_MONTHS  --------------------DATEADD

兩個(gè)日期的差 (date column +/- value) or MONTHS_BETWEEN  --------------------DATEDIFF
當(dāng)前日期和時(shí)間 SYSDATE --------------------GETDATE()
一個(gè)月的最后一天 LAST_DAY  --------------------N/A
時(shí)區(qū)轉(zhuǎn)換 NEW_TIME  --------------------N/A
日期后的第一個(gè)周日 NEXT_DAY  --------------------N/A
代表日期的字符串 TO_CHAR --------------------DATENAME
代表日期的整數(shù) TO_NUMBER (TO_CHAR))  --------------------DATEPART
日期舍入 ROUND  --------------------CONVERT
日期截?cái)?TRUNC  --------------------CONVERT
字符串轉(zhuǎn)換為日期 TO_DATE  --------------------CONVERT
如果為NULL則轉(zhuǎn)換日期 NVL -------------------- ISNULL

轉(zhuǎn)換函數(shù)

下面是Oracle支持的轉(zhuǎn)換函數(shù)和它們的Microsoft SQL Server等價(jià)函數(shù)。

函數(shù) Oracle  --------------------Microsoft SQL Server
數(shù)字轉(zhuǎn)換為字符 TO_CHAR  --------------------CONVERT
字符轉(zhuǎn)換為數(shù)字 TO_NUMBER  --------------------CONVERT
日期轉(zhuǎn)換為字符 TO_CHAR  --------------------CONVERT
字符轉(zhuǎn)換為日期 TO_DATE CONVERT
16進(jìn)制轉(zhuǎn)換為2進(jìn)制 HEX_TO_RAW  --------------------CONVERT
2進(jìn)制轉(zhuǎn)換為16進(jìn)制 RAW_TO_HEX  --------------------CONVERT

其它行級別的函數(shù)

下面是Oracle支持的其它行級別的函數(shù)以及它們的Microsoft SQL Server等價(jià)函數(shù)。

函數(shù) Oracle  --------------------Microsoft SQL Server
返回第一個(gè)非空表達(dá)式 DECODE -------------------------------------COALESCE
當(dāng)前序列值 CURRVAL  --------------------N/A
下一個(gè)序列值 NEXTVAL  --------------------N/A

用戶登錄賬號ID數(shù)字 UID --------------------SUSER_ID
用戶登錄名 USER  --------------------SUSER_NAME
用戶數(shù)據(jù)庫ID數(shù)字 UID  --------------------USER_ID
用戶數(shù)據(jù)庫名 USER  --------------------USER_NAME
當(dāng)前用戶 CURRENT_USER -------------------- CURRENT_USER
用戶環(huán)境(audit trail) USERENV  --------------------N/A
在CONNECT BY子句中的級別 LEVEL  --------------------N/A

合計(jì)函數(shù)

下面是Oracle支持的合計(jì)函數(shù)和它們的Microsoft SQL Server等價(jià)函數(shù)。

函數(shù) Oracle  --------------------Microsoft SQL Server
Average AVG -------------------- AVG
Count COUNT  --------------------COUNT
Maximum MAX -------------------- MAX
Minimum MIN  --------------------MIN
Standard deviation STDDEV  --------------------STDEV or STDEVP
Summation SUM -------------------- SUM
Variance VARIANCE  --------------------VAR or VARP

條件測試

Oracle的DECODE語句和Microsoft SQL Server的CASE表達(dá)式都執(zhí)行條件測試。
當(dāng)test_value中的值和后面的任何表達(dá)式匹配的時(shí)候,相關(guān)的值就返回。如果沒有找到任何匹配的值,就返回default_value。
如果沒有指定default_value,在沒有匹配的時(shí)候,DECODE和CASE都返回一個(gè)NULL。下表顯示了該語句的語法,
同時(shí)給出了轉(zhuǎn)換DECODE命令的示例。

Oracle Microsoft SQL 
DECODE (test_value,
expression1, value1
<,expression2, value2] […>
[,default_value]
)
CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
(SSN, GPA)
AS SELECT SSN, ROUND(AVG(DECODE(grade
,'A', 4
,'A+', 4.3
,'A-', 3.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.GRADE
GROUP BY SSN
CASE input_expression
WHEN when_expression THEN    result_expression

[ELSE else_result_expression]
END
CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
(SSN, GPA)
AS SELECT SSN, ROUND(AVG(CASE grade
WHEN 'A' THEN 4
WHEN 'A+' THEN 4.3
WHEN 'A-' THEN 3.7
WHEN 'B' THEN 3
WHEN 'B+' THEN 3.3
WHEN 'B-' THEN 2.7
WHEN 'C' THEN 2
WHEN 'C+' THEN 2.3
WHEN 'C-' THEN 1.7
WHEN 'D' THEN 1
WHEN 'D+' THEN 1.3
WHEN 'D-' THEN 0.7
ELSE 0
END),2)
FROM STUDENT_ADMIN.GRADE
GROUP BY SSN

CASE表達(dá)式可以支持用SELECT語句執(zhí)行布爾測試,這是DECODE命令所不允許的。欲了解關(guān)于CASE表達(dá)式的詳細(xì)信息,
請參閱SQL Server聯(lián)機(jī)手冊。

把值轉(zhuǎn)換為不同的數(shù)據(jù)類型

Microsoft SQL Server的CONVERT和CAST函數(shù)都是多目標(biāo)轉(zhuǎn)換函數(shù)。它們提供了相似的功能,
把一種數(shù)據(jù)類型的表達(dá)式轉(zhuǎn)換為另一種數(shù)據(jù)類型的表達(dá)式,并且支持多種專門數(shù)據(jù)的格式。

CAST(expression AS data_type)
CONVERT (data type[(length)], expression [, style])
CAST是一個(gè)SQL-92標(biāo)準(zhǔn)的函數(shù)。這些函數(shù)執(zhí)行同Oracle的TO_CHAR、TO_NUMBER、TO_DATE、HEXTORAW以及RAWTOTEXT函數(shù)相同的功能。

這里所指的數(shù)據(jù)類型是任何表達(dá)式將被轉(zhuǎn)換成為的系統(tǒng)數(shù)據(jù)類型。不能使用用戶定義的數(shù)據(jù)類型。長度參數(shù)是可選的,
該參數(shù)用于char、varchar、binary以及varbinary數(shù)據(jù)類型。允許的最大長度是8000。

轉(zhuǎn)換 Oracle Microsoft SQL Server
字符到數(shù)字 TO_NUMBER(?')  --------------------CONVERT(numeric, ?')
數(shù)字到字符 TO_CHAR(10)  --------------------CONVERT(char, 10)
字符到日期 TO_DATE(?-JUL-97')
TO_DATE(?-JUL-1997','dd-mon-yyyy')

TO_DATE('July 4, 1997', 'Month dd, yyyy') --------------------CONVERT(datetime, ?-JUL-97')

CONVERT(datetime, ?-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)
CONVERT(char, GETDATE(), 101)
16進(jìn)制到2進(jìn)制 HEXTORAW(?F')-------------------- CONVERT(binary, ?F')
2進(jìn)制到16進(jìn)制 RAWTOHEX(binary_column) --------------------CONVERT(char, binary_column)

請注意字符串是怎樣轉(zhuǎn)換為日期的。在Oracle中,缺省的日期格式模型是"DD-MON-YY"如果你使用任何其它格式,
你必須提供一個(gè)合適的日期格式模型。CONVERT函數(shù)自動轉(zhuǎn)換標(biāo)準(zhǔn)日期格式,不需要任何格式模型。

從日期轉(zhuǎn)換到字符串時(shí),CONVERT函數(shù)的缺省輸出是"dd mon yyyy hh:mm:ss:mmm(24h)"。
用一個(gè)數(shù)字風(fēng)格代碼來格式化輸出,使它能輸出為其它類型的日期格式模型。欲了解CONVERT函數(shù)的詳細(xì)信息,請參閱SQL Server聯(lián)機(jī)手冊。

下表顯示了Microsoft SQL Server日期的缺省輸出。

Without Century With Century Standard Output
- 0 or 100 (*) Default mon dd yyyy hh:miAM (or PM)
1 101 USA mm/dd/yy
2 102 ANSI yy.mm.dd
3 103 British/French dd/mm/yy
4 104 German dd.mm.yy
5 105 Italian dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 or 109 (*) Default milliseconds mon dd yyyy hh:mi:ss:mmm (AM or PM)
10 110 USA mm-dd-yy
11 111 Japan yy/mm/dd
12 112 ISO yymmdd
- 13 or 113 (*) Europe default dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)

用戶自定義函數(shù)

Oracle PL/SQL函數(shù)可以在Oracle SQL語句中使用。在Microsoft SQL Server中一般可以通過其它方式來實(shí)現(xiàn)同樣的功能。

在SQL Server中可以用表中給出的查詢來代替。

Oracle Microsoft SQL Server
SELECT SSN, FNAME, LNAME, )    TUITION_PAID,
   TUITION_PAID/GET_SUM_
   MAJOR(MAJOR)
   AS PERCENT_MAJOR
FROM STUDENT_ADMIN.STUDENT SELECT SSN, FNAME, LNAME, TUITION_PAID, TUITION_PAID/SUM_MAJOR AS PERCENT_MAJOR
FROM STUDENT_ADMIN.STUDENT,
  (SELECT MAJOR,      SUM(TUITION_PAID) SUM_MAJOR
  FROM STUDENT_ADMIN.STUDENT
  GROUP BY MAJOR) SUM_STUDENT
WHERE STUDENT.MAJOR =      SUM_STUDENT.MAJOR
CREATE OR REPLACE FUNCTION GET_SUM_MAJOR
(INMAJOR VARCHAR2) RETURN NUMBER
AS SUM_PAID NUMBER;
BEGIN
SELECT SUM(TUITION_PAID) INTO    SUM_PAID
FROM STUDENT_ADMIN.STUDENT
WHERE MAJOR = INMAJOR;
RETURN(SUM_PAID);
END GET_SUM_MAJOR; No CREATE FUNCTION syntax is required; use CREATE PROCEDURE syntax.

比較操作符

Oracle和Microsoft SQL Server的比較操作符幾乎是一樣的。

算符 Oracle Microsoft SQL Server
等于 (=) (=)
大于 (>) (>)
小于 (<) (<)
大于或等于 (>=) (>=)
小于或等于 (<=) (<=)
不等于 (!=, <>, ^=) (!=, <>, ^=)
不大于,不小于 N/A !> , !<
在集合中任意成員中 IN IN
不在集合中的任何成員中 NOT IN NOT IN
集合中的任意值 ANY, SOME ANY, 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
像模式(Like pattern) LIKE LIKE
不像模式(Not like pattern) NOT LIKE NOT LIKE
X和y之間的值 BETWEEN x AND y BETWEEN x AND y
不在x和y之間的值 NOT BETWEEN NOT BETWEEN
值存在 EXISTS EXISTS
值不存在 NOT EXISTS NOT EXISTS
值{為|不為}空 IS NULL, IS NOT NULL Same. Also = NULL,
!= NULL for backward compatibility (not recommended).

模式匹配

SQL Server的LIKE關(guān)鍵字提供了有用的通配符搜索功能,這個(gè)功能在Oracle中不支持
除了所有的RDBMS都支持的(%)和(_)通配符以外,SQL Server還支持([ ])和([^])通配符。

([ ])字符用來查詢在一個(gè)范圍內(nèi)的所有單個(gè)字符。例如,如果你需要查詢包含一個(gè)從a到f的字符的數(shù)據(jù),
你可以這樣寫:“LIKE '[a-f]'”或者“LIKE '[abcdef]'”。這些附加的通配符的有效性在下表中給出。

Oracle:
SELECT * FROM STUDENT_ADMIN.STUDENT
WHERE LNAME LIKE 'A%'
OR LNAME LIKE 'B%'
OR LNAME LIKE 'C%' ;

Microsoft SQL:

SELECT * FROM STUDENT_ADMIN.STUDENT
WHERE LNAME LIKE '[ABC]%';

[^]通配符用來標(biāo)記那些不在特定范圍內(nèi)的字符。例如,如果除了a到f以外的所有字符都是可以接受的,你可以這樣書寫:
LIKE '[^a - f]'或者LIKE '[^abcdef]'。

欲了解關(guān)于LIKE關(guān)鍵字的詳細(xì)信息,請參閱SQL Server聯(lián)機(jī)手冊。

在比較中使用NULL

盡管Microsoft SQL Server傳統(tǒng)上支持SQL-92標(biāo)準(zhǔn)的和一些非標(biāo)準(zhǔn)的NULL行為,但是它還是支持Oracle中的NULL的用法。

為了支持分布式查詢,SET ANSI_NULLS必須設(shè)定為ON。

在進(jìn)行連接的時(shí)候,SQL Server的SQL Server ODBC驅(qū)動程序和OLE DB提供者自動把SET ANSI_NULLS設(shè)定為ON。
這個(gè)設(shè)置可以在ODBC數(shù)據(jù)源、ODBC連接屬性、或者是在連接到SQL Server之前在應(yīng)用程序中設(shè)置的OLE DB連接屬性中進(jìn)行配置。
在從DB-Library應(yīng)用程序中連接時(shí),SET ANSI_NULLS缺省為OFF。

當(dāng)SET ANSI_DEFAULTS為ON時(shí),SET ANSI_NULLS被允許。

欲了解關(guān)于NULL用法的詳細(xì)信息,請參閱SQL Server聯(lián)機(jī)手冊。

字串連接

Oracle使用兩個(gè)管道符號(||)來作為字串連接操作符,SQL Server則使用加號(+)。這個(gè)差別要求你在應(yīng)用程序中做小小的修改。

Oracle:  
SELECT FNAME||' '||LNAME AS NAME
FROM STUDENT_ADMIN.STUDENT;

/
-----------------------------------------------

Microsoft SQL:
 SELECT FNAME +' '+ LNAME AS    NAME
FROM STUDENT_ADMIN.STUDENT

流控制(Control-of-Flow)語言

流控制語言控制SQL語句執(zhí)行流,語句塊以及存儲過程。PL/SQL和Transact-SQL提供了多數(shù)相同的結(jié)構(gòu),但是還是有一些語法差別。

關(guān)鍵字

這是兩個(gè)RDBMS支持的關(guān)鍵字。

語句 Oracle PL/SQL :

聲明變量 DECLARE DECLARE
語句塊 BEGIN...END; BEGIN...END
條件處理 IF…THEN,
ELSIF…THEN,
ELSE
ENDIF;
--------------------------------------------------------

Microsoft SQL Server Transact-SQL:
IF…[BEGIN…END]
ELSE <condition>
[BEGIN…END]
ELSE IF <condition>
CASE expression
無條件結(jié)束 RETURN------------ RETURN
無條件結(jié)束當(dāng)前程序塊后面的語句 EXIT BREAK
重新開始一個(gè)WHILE循環(huán) N/A CONTINUE
等待指定間隔 N/A (dbms_lock.sleep) WAITFOR
循環(huán)控制 WHILE LOOP…END LOOP;
------------
LABEL…GOTO LABEL;
FOR…END LOOP;
LOOP…END LOOP;
WHILE <condition>
BEGIN… END
LABEL…GOTO LABEL

程序注釋 /* … */, -- /* … */, --
打印輸出 RDBMS_OUTPUT.PUT_LINE PRINT

引發(fā)程序錯(cuò)誤(Raise program error) RAISE_APPLICATION_ERROR --------------------RAISERROR

執(zhí)行程序 EXECUTE----------------------EXECUTE
語句終止符 Semicolon (;) ------------------N/A

聲明變量

Transact-SQL和PL/SQL的變量是用DECLARE關(guān)鍵字創(chuàng)建的。Transact-SQL變量用@標(biāo)記,
并且就像PL/SQL一樣,在第一次創(chuàng)建時(shí),用空值初始化。

Oracle :  
DECLARE
VSSN CHAR(9);
VFNAME VARCHAR2(12);
VLNAME VARCHAR2(20);
VBIRTH_DATE DATE;

VLOAN_AMOUNT NUMBER(12,2);
-----------------------------------------

Microsoft SQL:
DECLARE
@VSSN CHAR(9),
@VFNAME VARCHAR2(12),
@VLNAME VARCHAR2(20),
@VBIRTH_DATE DATETIME,
@VLOAN_AMOUNT NUMERIC(12,2)

Transact-SQL不支持%TYPE和%ROWTYPE變量數(shù)據(jù)類型定義。一個(gè)Transact-SQL變量不能在DECLARE命令中初始化。
在Microsoft SQL Server數(shù)據(jù)類型定義中也不能使用Oracle的NOT NULL和CONSTANT關(guān)鍵字。

像Oracle的LONG和LONG RAW數(shù)據(jù)類型一樣。文本和圖形數(shù)據(jù)類型不能被用做變量定義。
此外,Transact-SQL不支持PL/SQL風(fēng)格的記錄和表的定義。

給變量賦值

Oracle和Microsoft SQL Server提供了下列方法來為本地變量賦值。

Oracle Microsoft SQL 
Assignment operator (:=) ---------------------SET @local_variable = value
SELECT...INTO syntax for selecting column values from a single row
-------------------------
SELECT @local_variable = expression [FROM…] for assigning a literal value,
 an expression involving other local variables, or a column value from a single row

FETCH…INTO syntax------------------------------- FETCH…INTO syntax

這里有一些語法示例

Oracle:
DECLARE VSSN CHAR(9);
VFNAME VARCHAR2(12);
VLNAME VARCHAR2(20);
BEGIN
VSSN := ?';
SELECT FNAME, LNAME INTO VFNAME, VLNAME FROM STUDENTS WHERE SSN=VSSN;
END;

/
------------------------------------------------------------------------------

Microsoft SQL:
DECLARE @VSSN CHAR(9),
@VFNAME VARCHAR(12),
@VLNAME VARCHAR(20)
SET @VSSN = ?'
SELECT @VFNAME=FNAME, @VLNAME=LNAME FROM STUDENTS WHERE SSN = @VSSN

語句塊

Oracle PL/SQL和Microsoft SQL Server Transact-SQL都支持用BEGIN…END術(shù)語來標(biāo)記語句塊。
Transact-SQL不需要在DECLARE語句后使用一個(gè)語句塊。
---------------------------------------------------------------------------------
-如果在Microsoft SQL Server
中的IF語句和WHILE循環(huán)中有多于一個(gè)語句被執(zhí)行,則需要使用BEGIN…END語句塊。

Oracle: Microsoft SQL:
DECLARE
DECLARE VARIABLES ...
BEGIN -- THIS IS REQUIRED SYNTAX
PROGRAM_STATEMENTS ...
IF ...THEN
STATEMENT1;
STATEMENT2;
STATEMENTN;
END IF;
WHILE ... LOOP
STATEMENT1;
STATEMENT2;
STATEMENTN;
END LOOP;
END; -- THIS IS REQUIRED SYNTAX DECLARE
DECLARE VARIABLES ...
BEGIN -- THIS IS OPTIONAL SYNTAX
PROGRAM_STATEMENTS ...
IF ...
BEGIN
STATEMENT1
STATEMENT2
STATEMENTN
END
WHILE ...
BEGIN
STATEMENT1
STATEMENT2
STATEMENTN
END
END -- THIS IS REQUIRED SYNTAX

條件處理

Microsoft SQL Server Transact-SQL的條件語句包括IF和ELSE,但不包括Oracle PL/SQL中的ELSEIF語句。
可以用嵌套多重IF語句來到達(dá)同樣的效果。對于廣泛的條件測試,用CASE表達(dá)式也許更容易和可讀一些。

Oracle Microsoft SQL 
DECLARE
VDEGREE_PROGRAM CHAR(1);
VDEGREE_PROGRAM_NAME VARCHAR2(20);
BEGIN
VDEGREE_PROGRAM := 'U';
IF VDEGREE_PROGRAM = 'U' THEN VDEGREE_PROGRAM_NAME := 'Undergraduate';

ELSIF VDEGREE_PROGRAM = 'M' THEN VDEGREE_PROGRAM_NAME := 'Masters';
ELSIF VDEGREE_PROGRAM = 'P'  THEN VDEGREE_PROGRAM_NAME := 'PhD';
ELSE VDEGREE_PROGRAM_NAME := 'Unknown';
END IF;
END;

/

-----------------------------------------------------
DECLARE
@VDEGREE_PROGRAM CHAR(1),
@VDEGREE_PROGRAM_NAME VARCHAR(20)
set @VDEGREE_PROGRAM = 'U'
SELECT @VDEGREE_PROGRAM_NAME =

        CASE @VDEGREE_PROGRAM
   WHEN 'U' THEN 'Undergraduate'
   WHEN 'M' THEN 'Masters'
   WHEN 'P' THEN 'PhD'.
   ELSE 'Unknown'
        END

重復(fù)執(zhí)行語句(循環(huán))

Oracle PL/SQL提供了無條件的LOOP和FOR LOOP。Transact-SQL則提供了WHILE循環(huán)和GOTO語句。

WHILE Boolean_expression
{sql_statement | statement_block}

[BREAK] [CONTINUE]

WHILE循環(huán)需要測試一個(gè)布爾表達(dá)式來決定一個(gè)或者多個(gè)語句的重復(fù)執(zhí)行。
只要給定的表達(dá)式結(jié)果為真,這個(gè)(些)語句就一直重復(fù)執(zhí)行下去。如果有多個(gè)語句需要執(zhí)行,則這些語句必須放在一個(gè)BEGIN…END塊中。

Oracle:  
DECLARE
COUNTER NUMBER;
BEGIN
COUNTER := 0;
WHILE (COUNTER <5) LOOP
COUNTER := COUNTER + 1;
END LOOP
END;

/
------------------------------------------------------

Microsoft SQL:
DECLARE
@COUNTER NUMERIC
SELECT @COUNTER = 1
WHILE (@COUNTER <5)
BEGIN
   SELECT @COUNTER =
   @COUNTER +1
END

語句的執(zhí)行可以在循環(huán)的內(nèi)部用BREAK和CONTINUE關(guān)鍵字控制。BREAK關(guān)鍵字使WHILE循環(huán)無條件的結(jié)束,
而CONTINUE關(guān)鍵字使WHILE循環(huán)跳過后面的語句重新開始。BREAK關(guān)鍵字同Oracle PL/SQL中的EXIT關(guān)鍵字是等價(jià)的。
而在Oracle中沒有和CONTINUE等價(jià)的關(guān)鍵字

GOTO語句

Oracle和Microsoft SQL Server都有GOTO語句,但是語法不同。GOTO語句使Transact-SQL跳到指定的標(biāo)號處運(yùn)行,
在GOTO語句后指定標(biāo)號之間的任何語句都不會被執(zhí)行。

Oracle Microsoft SQL 
GOTO label;
<<label name here>> GOTO label

PRINT語句

Transact-SQL的PRINT語句執(zhí)行同PL/SQL的RDBMS_OUTPUT.put_line 過程同樣的操作。該語句用來打印用戶給定的消息。

用PRINT語句打印的消息上限是8,000個(gè)字符。定義為char或者varchar數(shù)據(jù)類型的變量可以嵌入打印語句。
如果使用其它數(shù)據(jù)類型的變量,則必須使用CONVERT或者CAST函數(shù)。本地變量、全局變量可以被打印??梢杂脝我柣蛘唠p引號來封閉文本。

從存儲過程返回

Microsoft SQL Server和Oracle都有RETURN語句。RETURN使你的程序從查詢或者過程中無條件的跳出。RETURN是立即的、
完全的、并且可以用于從過程、批處理或者語句塊的任意部分跳出。在REUTRN后面的語句將不會被執(zhí)行。

Oracle Microsoft SQL 
RETURN expression: RETURN [integer_expression]

引發(fā)程序錯(cuò)誤(Raising program errors)

Transact-SQL的RAISERROR返回一個(gè)用戶定義的錯(cuò)誤消息,并且設(shè)置一個(gè)系統(tǒng)標(biāo)志來記錄發(fā)生了一個(gè)錯(cuò)誤。
這個(gè)功能同PL/SQL的raise_application_error異常處理器的功能是相似的。

RAISERROR語句允許客戶重新取得sysmessages表的一個(gè)入口,或者用用戶指定的嚴(yán)重性和狀態(tài)信息動態(tài)的建立一條消息。
在被定義后,消息被送回客戶端作為系統(tǒng)錯(cuò)誤消息。

RAISERROR ({msg_id | msg_str}, severity, state
[, argument1 [, argument2>)

[WITH options]

在轉(zhuǎn)換你的PL/SQL程序時(shí),也許用不著使用RAISERROR語句。在下面的示例代碼中。
PL/SQL程序使用raise_application_error異常處理器,但是Transact-SQL程序則什么也沒用。
包括raise_application_error異常處理器是為了防止PL/SQL返回不明確的未經(jīng)處理的異常錯(cuò)誤消息。
作為代替,當(dāng)一個(gè)不可預(yù)見的問題發(fā)生的時(shí)候,異常處理器總是返回Oracle錯(cuò)誤消息。

當(dāng)一個(gè)Transact-SQL失敗時(shí),它總是返回一個(gè)詳細(xì)的錯(cuò)誤消息給客戶程序。因此,除非需要某些特定的錯(cuò)誤處理,
一般是不需要RAISERROR語句的。

Oracle Microsoft SQL 
CREATE OR REPLACE FUNCTION
DEPT_ADMIN.DELETE_DEPT
(VDEPT IN VARCHAR2) RETURN NUMBER AS
BEGIN
DELETE FROM DEPT_ADMIN.DEPT
WHERE DEPT = VDEPT;
RETURN(SQL%ROWCOUNT);
EXCEPTION
WHEN OTHER THEN
RAISE_APPLICATION_ERROR
(-20001,SQLERRM);
END DELETE_DEPT;
------------------------------------------------------
/ CREATE PROCEDURE
DEPT_ADMIN.DELETE_DEPT
@VDEPT VARCHAR(4) AS
DELETE FROM DEPT_DB.DBO.DEPT
WHERE DEPT = @VDEPT
RETURN @@ROWCOUNT
GO

實(shí)現(xiàn)游標(biāo)

Oracle在使用SELECT語句時(shí)總是需要游標(biāo),不管從數(shù)據(jù)庫中請求多少行。在Microsoft SQL Server,
SELECT語句并不把在返回客戶的行上附加游標(biāo)作為缺省的結(jié)果集合。這是一種返回?cái)?shù)據(jù)給客戶應(yīng)用程序的有效的方法。

SQL Server為游標(biāo)函數(shù)提供了兩種接口。當(dāng)在Transact-SQL批處理或者存儲過程中使用游標(biāo)的時(shí)候,SQL語句可用來聲明、
打開、和從游標(biāo)中抽取,就像定位更新和刪除一樣。當(dāng)使用來自DB-Library、ODBC、或者OLEDB程序的游標(biāo)時(shí),SQL Server
顯式的調(diào)用內(nèi)建的服務(wù)器函數(shù)來更有效的處理游標(biāo)。

當(dāng)從Oracle輸入一個(gè)PL/SQL過程時(shí),首先判斷是否需要在Transact-SQL中采用游標(biāo)來實(shí)現(xiàn)同樣的功能。如果游標(biāo)僅僅返回一
組行給客戶程序,就使用非游標(biāo)的SELECT語句來返回缺省的結(jié)果集合。如果游標(biāo)用來從行中一次取得一個(gè)數(shù)據(jù)給本地過程變量,
你就必須在Transact-SQL中使用游標(biāo)。

語法

下表顯示了使用游標(biāo)的語法。

操作 Oracle Microsoft SQL Server
聲明一個(gè)游標(biāo) CURSOR cursor_name [(cursor_parameter(s))]
IS select_statement;
----------------------------------------------------
DECLARE cursor_name CURSOR
[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR select_statement
[FOR UPDATE [OF column_name [,…n>]
打開一個(gè)游標(biāo) OPEN cursor_name [(cursor_parameter(s))];
----------------
OPEN cursor_name
從游標(biāo)中提?。‵etching) FETCH cursor_name INTO variable(s)
-------------------------------------------------------------------------------------------
FETCH FROM] cursor_name
[INTO @variable(s)]
更新提取行 UPDATE table_name
SET statement(s)…
WHERE CURRENT OF cursor_name; UPDATE table_name
SET statement(s)…
WHERE CURRENT OF cursor_name
刪除提取行 DELETE FROM table_name
WHERE CURRENT OF cursor_name; DELETE FROM table_name
WHERE CURRENT OF cursor_name
關(guān)閉游標(biāo) CLOSE cursor_name; CLOSE cursor_name
清除游標(biāo)數(shù)據(jù)結(jié)構(gòu) N/A DEALLOCATE cursor_name

聲明一個(gè)游標(biāo)

盡管Transact-SQL DECLARE CURSOR語句不支持游標(biāo)參數(shù)的使用,但它確實(shí)支持本地變量。當(dāng)游標(biāo)打開的時(shí)候,
它就使用這些本地變量的值。Microsoft SQL Server在其DECLARE CURSOR中提供了許多附加的功能。

INSENSITIVE選項(xiàng)用來定義一個(gè)創(chuàng)建數(shù)據(jù)的臨時(shí)拷貝以被游標(biāo)使用的游標(biāo)。游標(biāo)的所有請求都由這個(gè)臨時(shí)表來應(yīng)答。因此
對原表的修改不會反映到那些由fetch返回的用于該游標(biāo)的數(shù)據(jù)上。這種類型的游標(biāo)訪問的數(shù)據(jù)是不能被修改的。

應(yīng)用程序可以請求一個(gè)游標(biāo)類型然后執(zhí)行一個(gè)不被所請求的服務(wù)器游標(biāo)類型支持的Transact-SQL語句。SQL Server返回一個(gè)錯(cuò)誤,
指出該游標(biāo)類型被改變了,或者給出一組參數(shù),隱式的轉(zhuǎn)換游標(biāo)。欲取得一個(gè)觸發(fā)SQL Server 7.0隱式的把游標(biāo)從一種類型轉(zhuǎn)換為
另一種類型的參數(shù)的完整列表,請參閱SQL Server聯(lián)機(jī)手冊。

SCROLL選項(xiàng)允許除了前向的抽取以外,向后的、絕對的和相對的數(shù)據(jù)抽取。一個(gè)滾動游標(biāo)使用一種鍵集合的游標(biāo)模型,在該模型中,
任何用戶提交的對表的刪除和更新都將影響后來的數(shù)據(jù)抽取。只有在游標(biāo)沒有用INSENSITIVE選項(xiàng)聲明時(shí),上面的特性才起作用。

如果選擇了READ ONLY選項(xiàng),對游標(biāo)中的行的更新就被禁止。該選項(xiàng)將覆蓋游標(biāo)的缺省選項(xiàng)棗允許更新。

UPDATE [OF column_list]語句用來在游標(biāo)中定義一個(gè)可更新的列。如果提供了[OF column_list],那么僅僅是那些列出的列可以被修改。
如果沒有指定任何列。則所有的列都是可以更新的,除非游標(biāo)被定義為READ ONLY。

重要的是,注意到一個(gè)SQL Server游標(biāo)的名字范圍就是連接自己。這和本地變量的名字范圍是不同的。
不能聲明一個(gè)與同一個(gè)用戶連接上的已有的游標(biāo)相同名字的游標(biāo),除非第一個(gè)游標(biāo)被釋放。

打開一個(gè)游標(biāo)

Transact-SQL不支持向一個(gè)打開的游標(biāo)傳遞參數(shù),這一點(diǎn)和PL/SQL是不一樣的。當(dāng)一個(gè)Transact-SQL游標(biāo)被打開以后,
結(jié)果集的成員和順序就固定下來了。其它用戶提交的對原表的游標(biāo)的更新和刪除將反映到對所有未加INSENSITIVE選項(xiàng)定義
的游標(biāo)的數(shù)據(jù)抽取上。對一個(gè)INSENSITIVE游標(biāo),將生成一個(gè)臨時(shí)表。

抽取數(shù)據(jù)

Oracle游標(biāo)只能向前移動棗沒有向后或者相對滾動的能力。SQL Server游標(biāo)可以向前或者向后滾動,具體怎么滾動,
要由下表給出的數(shù)據(jù)抽取選項(xiàng)來決定。只有在游標(biāo)是用SCROLL選項(xiàng)聲明的前提下,這些選項(xiàng)才能使用。

卷動選項(xiàng) 描述
NEXT 如果這是對游標(biāo)的第一次提取,則返回結(jié)果集合的第一行;否則,在結(jié)果結(jié)合內(nèi)移動游標(biāo)到下一行。
NEXT是在結(jié)果集合中移動的基本方法 。NEXT是缺省的游標(biāo)提?。╢etch)。
PRIOR 返回結(jié)果集合的前一行。
FIRST 把游標(biāo)移動到結(jié)果集合的第一行,同時(shí)返回第一行。
LAST 把游標(biāo)移動到結(jié)果集合的最后一行,同時(shí)返回最后一行。
ABSOLUTE n 返回結(jié)果集合的第n行。如果n為負(fù)數(shù),則返回倒數(shù)第n行
RELATIVE n 返回當(dāng)前提取行后的第n行,如果n是負(fù)數(shù),則返回從游標(biāo)相對位置起的倒數(shù)第n行。

Transact-SQL的FETCH語句不需要INTO子句。如果沒有指定返回變量,行就自動作為一個(gè)單行結(jié)果集合返回給客戶。但是,
如果你的過程必須把行給客戶,一個(gè)不帶游標(biāo)的SELECT語句更有效一些。

在每一個(gè)FETCH后面,@@FETCH_STATUS函數(shù)被更新。這和在PL/SQL中使用CURSOR_NAME%FOUND和CURSOR_NAME%NOTFOUND變量是相似的
。@@FETCH_STATUS函數(shù)在每一次成功的數(shù)據(jù)抽取以后被設(shè)定為0。如果數(shù)據(jù)抽取試圖讀取一個(gè)超過游標(biāo)末尾的數(shù)據(jù),則返回一個(gè)為-1的值。
如果請求的行在游標(biāo)打開以后從表上被刪除了,@@FETCH_STATUS函數(shù)就返回一個(gè)為-2的值。只有游標(biāo)是用SCROLL選項(xiàng)定義的情況下,
才會返回-2值。在每一次數(shù)據(jù)抽取之后都必須檢查該變量,以確保數(shù)據(jù)的有效性。

SQL Server不支持Oracle的游標(biāo)FOR循環(huán)語法。

CURRENT OF子句

更新和刪除的CURRENT OF子句語法和函數(shù)在PL/SQL和Transact-SQL中是一樣的。在給定游標(biāo)中,在當(dāng)前行上執(zhí)行定位的UPDATE和DELETE。

關(guān)閉一個(gè)游標(biāo)

Transact-SQL的CLOSE CURSOR語句關(guān)閉游標(biāo),但是保留數(shù)據(jù)結(jié)構(gòu)以備重新打開。PL/SQL 的CLOSE CURSOR語句關(guān)閉并且釋放所有的數(shù)據(jù)結(jié)構(gòu)。

Transact-SQL需要用DEALLOCATE CURSOR語句來清除游標(biāo)數(shù)據(jù)結(jié)構(gòu)。DEALLOCATE CURSOR語句同CLOSE CURSOR是不一樣的,
后者保留數(shù)據(jù)結(jié)構(gòu)以備重新打開。DEALLOCATE CURSOR釋放所有與游標(biāo)相關(guān)的數(shù)據(jù)結(jié)構(gòu)并且清除游標(biāo)的定義。

游標(biāo)示例

下面的例子顯示了在PL/SQL和Transact-SQL等價(jià)的游標(biāo)語句。

Oracle Microsoft SQL 
-----------------------------------------------------------------------------------------------------------
DECLARE
VSSN CHAR(9);
VFNAME VARCHAR(12);
VLNAME VARCHAR(20);
-----------------------------------------------------------------------------------------------------------
DECLARE
@VSSN CHAR(9),
@VFNAME VARCHAR(12),
@VLNAME VARCHAR(20)
CURSOR CUR1
IS
SELECT SSN, FNAME, LNAME
FROM STUDENT ORDER BY LNAME;

BEGIN
    OPEN CUR1;
    FETCH CUR1 INTO VSSN,     VFNAME, VLNAME;
    WHILE (CUR1%FOUND) LOOP
    FETCH CUR1 INTO VSSN,     VFNAME, VLNAME;
END LOOP;
CLOSE CUR1;
END;
-----------------------------------------------------------------------------------------------------------
DECLARE curl CURSOR FOR
   SELECT SSN, FNAME, LNAME
   FROM STUDENT ORDER BY SSN
OPEN CUR1
FETCH NEXT FROM CUR1
   INTO @VSSN, @VFNAME, @VLNAME
WHILE (@@FETCH_STATUS <> -1)
   BEGIN
  FETCH NEXT FROM CUR1 INTO       @VSSN, @VFNAME, @VLNAME
   END
CLOSE CUR1
DEALLOCATE CUR1

關(guān)于ORACLE 系統(tǒng)函數(shù)與SQLSERVER系統(tǒng)函數(shù)的區(qū)別是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI