字串連接
Oracle 使用兩個管道符號(||)來作為字串連接操作符
Oracle Microsoft SQL
SELECT FNAME||
FROM STUDENT_ADMIN
SELECT FNAME +
FROM STUDENT_ADMIN
流控制(Control
流控制語言控制SQL 語句執行流
關鍵字
這是兩個RDBMS支持的關鍵字
語句 Oracle PL/SQL
聲明變量 DECLARE DECLARE
語句塊 BEGIN
條件處理 IF…THEN
ELSIF…THEN
ELSE
ENDIF;
IF…[BEGIN…END]
ELSE
[BEGIN…END]
ELSE IF
CASE expression
無條件結束 RETURN
無條件結束當前程序塊後面的語句 EXIT BREAK
重新開始一個WHILE循環 N/A CONTINUE
等待指定間隔 N/A (dbms_lock
循環控制 WHILE LOOP…END LOOP;
LABEL…GOTO LABEL;
FOR…END LOOP;
LOOP…END LOOP;
WHILE
BEGIN… END
LABEL…GOTO LABEL
程序注釋 /* … */
打印輸出 RDBMS_OUTPUT
引發程序錯誤(Raise program error) RAISE_APPLICATION_ERROR
執行程序 EXECUTE
語句終止符 Semicolon (;)
聲明變量
Transact
並且就像PL/SQL 一樣
Oracle Microsoft SQL
DECLARE
VSSN CHAR(
VFNAME VARCHAR
VLNAME VARCHAR
VBIRTH_DATE DATE;
VLOAN_AMOUNT NUMBER(
DECLARE
@VSSN CHAR(
@VFNAME VARCHAR
@VLNAME VARCHAR
@VBIRTH_DATE DATETIME
@VLOAN_AMOUNT NUMERIC(
Transact
在Microsoft SQL Server數據類型定義中也不能使用Oracle 的NOT NULL和CONSTANT關鍵字
像Oracle 的LONG和LONG RAW數據類型一樣
此外
給變量賦值
Oracle 和Microsoft SQL Server提供了下列方法來為本地變量賦值
Oracle Microsoft SQL
Assignment operator (:=)
SELECT
SELECT @local_variable = expression [FROM…] for assigning a literal value
an expression involving other local variables
FETCH…INTO syntax
這裡有一些語法示例
Oracle Microsoft SQL
DECLARE VSSN CHAR(
VFNAME VARCHAR
VLNAME VARCHAR
BEGIN
VSSN := ?
SELECT FNAME
END;
DECLARE @VSSN CHAR(
@VFNAME VARCHAR(
@VLNAME VARCHAR(
SET @VSSN = ?
SELECT @VFNAME=FNAME
語句塊
Oracle PL/SQL 和Microsoft SQL Server Transact
Transact
中的IF語句和WHILE循環中有多於一個語句被執行
Oracle Microsoft SQL
DECLARE
DECLARE VARIABLES
BEGIN
PROGRAM_STATEMENTS
IF
STATEMENT
STATEMENT
STATEMENTN;
END IF;
WHILE
STATEMENT
STATEMENT
STATEMENTN;
END LOOP;
END;
DECLARE VARIABLES
BEGIN
PROGRAM_STATEMENTS
IF
BEGIN
STATEMENT
STATEMENT
STATEMENTN
END
WHILE
BEGIN
STATEMENT
STATEMENT
STATEMENTN
END
END
條件處理
Microsoft SQL Server Transact
可以用嵌套多重IF語句來到達同樣的效果
Oracle Microsoft SQL
DECLARE
VDEGREE_PROGRAM CHAR(
VDEGREE_PROGRAM_NAME VARCHAR
BEGIN
VDEGREE_PROGRAM :=
IF VDEGREE_PROGRAM =
VDEGREE_PROGRAM_NAME :=
ELSIF VDEGREE_PROGRAM =
NAME :=
ELSIF VDEGREE_PROGRAM =
NAME :=
ELSE VDEGREE_PROGRAM_
NAME :=
END IF;
END;
DECLARE
@VDEGREE_PROGRAM CHAR(
@VDEGREE_PROGRAM_NAME VARCHAR(
SELECT @VDEGREE_PROGRAM =
SELECT @VDEGREE_PROGRAM_
NAME = CASE @VDEGREE_PROGRAM
WHEN
WHEN
WHEN
ELSE
END
重復執行語句(循環)
Oracle PL/SQL 提供了無條件的LOOP和FOR LOOP
WHILE Boolean_expression
{sql_statement | statement_block}
[BREAK] [CONTINUE]
WHILE循環需要測試一個布爾表達式來決定一個或者多個語句的重復執行
只要給定的表達式結果為真
Oracle Microsoft SQL
DECLARE
COUNTER NUMBER;
BEGIN
COUNTER :=
WHILE (COUNTER <
COUNTER := COUNTER +
END LOOP;
END;
DECLARE
@COUNTER NUMERIC
SELECT@COUNTER =
WHILE (@COUNTER <
BEGIN
SELECT @COUNTER =
@COUNTER +
END
語句的執行可以在循環的內部用BREAK和CONTINUE關鍵字控制
而CONTINUE關鍵字使WHILE循環跳過後面的語句重新開始
而在Oracle 中沒有和CONTINUE等價的關鍵字
GOTO語句
Oracle 和Microsoft SQL Server都有GOTO語句
在GOTO語句後指定標號之間的任何語句都不會被執行
Oracle Microsoft SQL
GOTO label;
<> GOTO label
PRINT語句
Transact
用PRINT語句打印的消息上限是
如果使用其它數據類型的變量
從存儲過程返回
Microsoft SQL Server和Oracle 都有RETURN語句
完全的
Oracle Microsoft SQL
RETURN expression: RETURN [integer_expression]
引發程序錯誤(Raising program errors)
Transact
這個功能同PL/SQL 的raise_application_error異常處理器的功能是相似的
RAISERROR語句允許客戶重新取得sysmessages表的一個入口
在被定義後
RAISERROR ({msg_id | msg_str}
[
[WITH options]
在轉換你的PL/SQL 程序時
PL/SQL 程序使用raise_application_error異常處理器
包括raise_application_error異常處理器是為了防止PL/SQL 返回不明確的未經處理的異常錯誤消息
作為代替
當一個Transact
一般是不需要RAISERROR語句的
Oracle Microsoft SQL
CREATE OR REPLACE FUNCTION
DEPT_ADMIN
(VDEPT IN VARCHAR
BEGIN
DELETE FROM DEPT_ADMIN
WHERE DEPT = VDEPT;
RETURN(SQL %ROWCOUNT);
EXCEPTION
WHEN OTHER THEN
RAISE_APPLICATION_ERROR
(
END DELETE_DEPT;
/ CREATE PROCEDURE
DEPT_ADMIN
@VDEPT VARCHAR(
DELETE FROM DEPT_DB
WHERE DEPT = @VDEPT
RETURN @@ROWCOUNT
GO
實現游標
Oracle 在使用SELECT語句時總是需要游標
SELECT語句並不把在返回客戶的行上附加游標作為缺省的結果集合
SQL Server為游標函數提供了兩種接口
打開
顯式的調用內建的服務器函數來更有效的處理游標
當從Oracle 輸入一個PL/SQL 過程時
組行給客戶程序
你就必須在Transact
語法
下表顯示了使用游標的語法
操作 Oracle Microsoft SQL Server
聲明一個游標 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 [
打開一個游標 OPEN cursor_name [(cursor_parameter(s))];
OPEN cursor_name
從游標中提取(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
關閉游標 CLOSE cursor_name; CLOSE cursor_name
清除游標數據結構 N/A DEALLOCATE cursor_name
聲明一個游標
盡管Transact
它就使用這些本地變量的值
INSENSITIVE選項用來定義一個創建數據的臨時拷貝以被游標使用的游標
對原表的修改不會反映到那些由fetch返回的用於該游標的數據上
應用程序可以請求一個游標類型然後執行一個不被所請求的服務器游標類型支持的Transact
指出該游標類型被改變了
另一種類型的參數的完整列表
SCROLL選項允許除了前向的抽取以外
任何用戶提交的對表的刪除和更新都將影響後來的數據抽取
如果選擇了READ ONLY選項
UPDATE [OF column_list]語句用來在游標中定義一個可更新的列
如果沒有指定任何列
重要的是
不能聲明一個與同一個用戶連接上的已有的游標相同名字的游標
打開一個游標
Transact
結果集的成員和順序就固定下來了
的游標的數據抽取上
抽取數據
Oracle 游標只能向前移動棗沒有向後或者相對滾動的能力
要由下表給出的數據抽取選項來決定
卷動選項 描述
NEXT 如果這是對游標的第一次提取
NEXT是在結果集合中移動的基本方法
PRIOR 返回結果集合的前一行
FIRST 把游標移動到結果集合的第一行
LAST 把游標移動到結果集合的最後一行
ABSOLUTE n 返回結果集合的第n行
RELATIVE n 返回當前提取行後的第n行
Transact
如果你的過程必須把行給客戶
在每一個FETCH後面
如果請求的行在游標打開以後從表上被刪除了
才會返回
SQL Server不支持Oracle 的游標FOR循環語法
CURRENT OF子句
更新和刪除的CURRENT OF子句語法和函數在PL/SQL 和Transact
關閉一個游標
Transact
Transact
後者保留數據結構以備重新打開
游標示例
下面的例子顯示了在PL/SQL 和Transact
Oracle Microsoft SQL
From:http://tw.wingwit.com/Article/program/Oracle/201311/17760.html