久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

133次閱讀
沒有評論

共計 17706 個字符,預(yù)計需要花費(fèi) 45 分鐘才能閱讀完成。

自動寫代碼機(jī)器人,免費(fèi)開通

這篇文章給大家介紹 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
將字串中的每個詞首字母大寫 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 等價函數(shù)。

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

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

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

下面是 Oracle 支持的轉(zhuǎn)換函數(shù)和它們的 Microsoft SQL Server 等價函數(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 等價函數(shù)。

函數(shù) Oracle  ——————–Microsoft SQL Server
返回第一個非空表達(dá)式 DECODE ————————————-COALESCE
當(dāng)前序列值 CURRVAL  ——————–N/A
下一個序列值 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

合計函數(shù)

下面是 Oracle 支持的合計函數(shù)和它們的 Microsoft SQL Server 等價函數(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á)式匹配的時候,相關(guān)的值就返回。如果沒有找到任何匹配的值,就返回 default_value。
如果沒有指定 default_value,在沒有匹配的時候,DECODE 和 CASE 都返回一個 NULL。下表顯示了該語句的語法,
同時給出了轉(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 是一個 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 如果你使用任何其它格式,
你必須提供一個合適的日期格式模型。CONVERT 函數(shù)自動轉(zhuǎn)換標(biāo)準(zhǔn)日期格式,不需要任何格式模型。

從日期轉(zhuǎn)換到字符串時,CONVERT 函數(shù)的缺省輸出是 dd mon yyyy hh:mm:ss:mmm(24h)。
用一個數(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)鍵字提供了有用的通配符搜索功能,這個功能在 Oracle 中不支持
除了所有的 RDBMS 都支持的(%)和(_)通配符以外,SQL Server 還支持([])和([^])通配符。

([])字符用來查詢在一個范圍內(nèi)的所有單個字符。例如,如果你需要查詢包含一個從 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)行連接的時候,SQL Server 的 SQL Server ODBC 驅(qū)動程序和 OLE DB 提供者自動把 SET ANSI_NULLS 設(shè)定為 ON。
這個設(shè)置可以在 ODBC 數(shù)據(jù)源、ODBC 連接屬性、或者是在連接到 SQL Server 之前在應(yīng)用程序中設(shè)置的 OLE DB 連接屬性中進(jìn)行配置。
在從 DB-Library 應(yīng)用程序中連接時,SET ANSI_NULLS 缺省為 OFF。

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

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

字串連接

Oracle 使用兩個管道符號(||)來作為字串連接操作符,SQL Server 則使用加號(+)。這個差別要求你在應(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)鍵字

這是兩個 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
重新開始一個 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ā)程序錯誤(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)建時,用空值初始化。

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ù)類型定義。一個 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 語句后使用一個語句塊。
———————————————————————————
- 如果在 Microsoft SQL Server
中的 IF 語句和 WHILE 循環(huán)中有多于一個語句被執(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)需要測試一個布爾表達(dá)式來決定一個或者多個語句的重復(fù)執(zhí)行。
只要給定的表達(dá)式結(jié)果為真,這個(些)語句就一直重復(fù)執(zhí)行下去。如果有多個語句需要執(zhí)行,則這些語句必須放在一個 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)鍵字是等價的。
而在 Oracle 中沒有和 CONTINUE 等價的關(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 個字符。定義為 char 或者 varchar 數(shù)據(jù)類型的變量可以嵌入打印語句。
如果使用其它數(shù)據(jù)類型的變量,則必須使用 CONVERT 或者 CAST 函數(shù)。本地變量、全局變量可以被打印。可以用單引號或者雙引號來封閉文本。

從存儲過程返回

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

Oracle Microsoft SQL
RETURN expression: RETURN [integer_expression]

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

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

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

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

[WITH options]

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

當(dāng)一個 Transact-SQL 失敗時,它總是返回一個詳細(xì)的錯誤消息給客戶程序。因此,除非需要某些特定的錯誤處理,
一般是不需要 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 語句時總是需要游標(biāo),不管從數(shù)據(jù)庫中請求多少行。在 Microsoft SQL Server,
SELECT 語句并不把在返回客戶的行上附加游標(biāo)作為缺省的結(jié)果集合。這是一種返回數(shù)據(jù)給客戶應(yīng)用程序的有效的方法。

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

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

語法

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

操作 Oracle Microsoft SQL Server
聲明一個游標(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]
打開一個游標(biāo) OPEN cursor_name [(cursor_parameter(s))];
—————-
OPEN cursor_name
從游標(biāo)中提取(Fetching)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

聲明一個游標(biāo)

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

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

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

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

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

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

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

打開一個游標(biāo)

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

抽取數(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)提取(fetch)。
PRIOR 返回結(jié)果集合的前一行。
FIRST 把游標(biāo)移動到結(jié)果集合的第一行,同時返回第一行。
LAST 把游標(biāo)移動到結(jié)果集合的最后一行,同時返回最后一行。
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 子句。如果沒有指定返回變量,行就自動作為一個單行結(jié)果集合返回給客戶。但是,
如果你的過程必須把行給客戶,一個不帶游標(biāo)的 SELECT 語句更有效一些。

在每一個 FETCH 后面,@@FETCH_STATUS 函數(shù)被更新。這和在 PL/SQL 中使用 CURSOR_NAME%FOUND 和 CURSOR_NAME%NOTFOUND 變量是相似的
。@@FETCH_STATUS 函數(shù)在每一次成功的數(shù)據(jù)抽取以后被設(shè)定為 0。如果數(shù)據(jù)抽取試圖讀取一個超過游標(biāo)末尾的數(shù)據(jù),則返回一個為 - 1 的值。
如果請求的行在游標(biāo)打開以后從表上被刪除了,@@FETCH_STATUS 函數(shù)就返回一個為 - 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)閉一個游標(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 等價的游標(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é)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

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

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-04發(fā)表,共計17706字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 拉萨市| 称多县| 江阴市| 本溪| 莱芜市| 白水县| 衢州市| 普宁市| 沂水县| 鹿泉市| 彭水| 台前县| 文登市| 肃宁县| 阆中市| 朝阳市| 鲁甸县| 大名县| 宁远县| 留坝县| 滁州市| 玉林市| 昭苏县| 涪陵区| 馆陶县| 罗源县| 栾川县| 成都市| 芦山县| 涪陵区| 平舆县| 宜兴市| 中阳县| 房山区| 黄骅市| 永福县| 北宁市| 南皮县| 罗田县| 义乌市| 嵩明县|