聲明變量
Transact
SQL 和 PL/SQL 變量是使用 DECLARE 關鍵字來創建的
Transact
SQL 變量用 @ 來標識
並且像 PL/SQL 變量一樣
第一次創建時該變量被初始化為空值
Transact
SQL 不支持 %TYPE 和 %ROWTYPE 變量數據類型定義
在 DECLARE 命令中
不能對 Transact
SQL 變量進行初始化
Oracle NOT NULL 和 CONSTANT 關鍵字不能用在 Microsoft SQL Server 數據類型定義中
與 Oracle LONG 和 LONG RAW 數據類型一樣
text 和 image 數據類型不能用於變量聲明
此外
不支持 PL/SQL 類型的記錄和表定義
變量賦值
Oracle 和 Microsoft SQL Server 提供以下方法
給局部變量賦值
語句塊
Oracle PL/SQL 和 Microsoft SQL Server Transact
SQL 支持使用 BEGINUEND 術語
來指定程序塊
Transact
SQL 不要求在 DECLARE 語句後面使用語句塊
在 Microsoft SQL Server 中
如果 IF 語句和 WHILE 循環執行不止一個語句
需要使用 BEGINUEND 語句塊
條件處理
Microsoft SQL Server Transact
SQL 條件語句包含 IF 和 ELSE 語句
而不是 Oracle PL/SQL 中的 ELSIF 語句
可以嵌套多個 IF 語句
來達到同樣的效果
對於大量的條件測試
CASE 表達式更容易閱讀
重復的語句執行(循環)
Oracle PL/SQL 提供了無條件的 LOOP 和 FOR LOOP
而 Transact
SQL 則提供了 WHILE 循環和 GOTO 語句
來達到循環的目的
WHILE Boolean_expression
{sql_statement | statement_block}
[BREAK] [CONTINUE]
對於一個或多個語句的重復執行
WHILE 循環測試一個布爾表達式
只要給定的表達式求值為 TRUE
語句就會重復執行
如果要執行多個語句
它們必須放在一個 BEGINUEND 塊中
可以使用 BREAK 和 CONTINUE 關鍵字
從循環的內部控制語句的執行
BREAK 關鍵字導致從 WHILE 循環中無條件退出
CONTINUE 關鍵字使 WHILE 循環跳過後面的語句
並重新開始循環
BREAK 關鍵字和 Oracle PL/SQL EXIT 關鍵字等同
Oracle 沒有 CONTINUE 的對等關鍵字
GOTO 語句
Oracle 和 Microsoft SQL Server 均有 GOTO 語句
但是語法不同
遇到 GOTO 語句
Transact
SQL 批處理執行就會跳到標號處
GOTO 語句和標號之間的語句不執行
PRINT 語句
Transact
SQL PRINT 語句和 PL/SQL RDBMS_OUTPUT
put_line 過程所執行的操作相同
它用於打印用戶指定的消息
PRINT 語句的消息限度為
個字符
使用 char 或 varchar 數據類型定義的變量可以嵌入打印語句中
如果使用了任何其它數據類型
必須使用 CONVERT 或 CAST 函數
可以打印局部變量
全局變量和文本
可用單引號和雙引號將文本括上
從存儲過程返回
Microsoft SQL Server 和 Oracle 均有 RETURN 語句
使用 RETURN 語句
程序可從查詢或過程無條件退出
RETURN 是一條可立即執行的完整語句
並可在任何時候用於從過程
批處理或語句塊中退出
RETURN 後面的語句均不執行
提出程序錯誤
Transact
SQL RAISERROR 語句返回一個用戶定義的錯誤信息
並設定一個系統標志
來記錄已發生了一個錯誤
它和 PL/SQL raise_application_error 異常錯誤處理程序的功能相似
RAISERROR 語句允許客戶從 sysmessages 表檢索一個條目
或使用用戶定義的嚴重性和狀態信息動態地創建一條消息
定義後
此消息作為服務器錯誤信息返回給客戶
RAISERROR ({msg_id | msg_str}
severity
state
[
argument
[
argument
]])
[WITH options]
轉換 PL/SQL 程序時
可能不需要使用 RAISERROR 語句
在下面的代碼示例中
PL/SQL 程序使用 raise_application_error 異常錯誤處理程序
而 Transact
SQL 程序什麼也不使用
加入 raise_application_error 異常錯誤處理程序
可避免 PL/SQL 程序返回二義性的 unhandled exception 錯誤信息
相反
當發生意外問題時
它總是返回 Oracle 錯誤信息 (SQLERRM)
當 Transact
SQL 程序失敗時
它總是給客戶程序返回詳細的錯誤信息
因此
除非需要進行專門錯誤處理
否則
並不總是需要 RAISERROR 語句
游標的實現
不管從數據庫中請求行數的多少
Oracle 始終要求游標和 SELECT 語句一起使用
在 Microsoft SQL Server 中
未包含在游標內的 SELECT 語句把行作為默認結果集
返回給客戶
這是一種將數據返回給客戶程序的有效方法
SQL Server 給游標函數提供了兩個接口
當在 Transact
SQL 批處理或存儲過程時使用游標時
SQL 語句可用來聲明
打開游標和從游標以及定位更新和刪除中提取
當使用來自 DB
Library
ODBC 或 OLE DB 的游標時
SQL Server 客戶機庫透明地調用內置的服務器函數
以更有效地處理游標
當從 Oracle 導入 PL/SQL 過程時
首先確定游標是否需要執行和 Transact
SQL 中相同的功能
如果游標只給客戶程序返回一組行
則使用 Transact
SQL 中無游標的 SELECT 語句
返回一個默認的結果集
如果使用游標向局部過程變量每次加載一行數據
則必須使用 Transact
SQL 中的游標
下表給出了游標的使用語法
盡管 Transact
SQL DECLARE CURSOR 語句不支持使用游標參數
但它的確支持局部變量
當游標打開時
這些局部變量的值可在游標中使用
Microsoft SQL Server 在其 DECLARE CURSOR 語句中提供了許多額外的功能
INSENSITIVE 選項用於定義游標
使之創建一個要使用的數據的臨時副本
對游標的所有請求均由此臨時表應答
因此
對基表的修改不會反映在對該游標提取所返回的數據中
這種類型游標訪問的數據不能被修改
應用程序可以請求一種游標類型
然後執行一條不被所請求類型服務器游標支持的 Transact
SQL 語句
SQL Server 就會返回一個錯誤
指出游標類型已經更改
或者如給定了一組要素
SQL Server 就會隱式轉換游標
有關使 SQL Server
隱式地將游標從一種類型轉換到另一種類型的完整要素列表
請參見 SQL Server Books Online
除向前提取外
SCROLL 選項還允許向後
絕對和相對提取
滾動游標使用鍵集游標模型
在該模型中
任何用戶對基表的已提交刪除和更新都會反映在以後的提取中
僅當沒有使用 INSENSITIVE 選項來聲明該游標時
才成立
如果選定了 READ ONLY 選項
則禁止對游標中的任何行進行更新
該選項將改寫對游標更新的默認功能
UPDATE [OF column_list] 語句用於定義游標中可更新的列
如果給出了 [OF column_list]
則只有列出的列允許修改
如果沒有給出列表
所有的列均可更新
除非游標已定義為 READ ONLY
注意到
SQL Server 游標的名稱作用域就是連接本身這一點
是很重要的
這和局部變量的名稱作用域不同
在同一用戶連接上
在第一個游標釋放之前
不能聲明與現有游標名稱相同的第二個游標
與 PL/SQL 不同
在一個游標打開時
Transact
SQL 不支持向該游標傳遞參數
當 Transact
SQL 游標打開時
結果集成員身份和次序是固定的
對於其他用戶已提交的對基表的更新和刪除
均會反映在所有未使用 INSENSITIVE 選項定義的游標提取中
對於 INSENSITIVE 游標
還會生成一個臨時表
Oracle 游標只能向前移動
不能向後或相對滾動
SQL Server 可以使用下表所示的提取選項
向前和向後滾動
只有當游標使用 SCROLL 選項聲明時
這些提取選項才可以使用
Transact
SQL FETCH 語句不需要 INTO 子句
如果沒有指定返回變量
該行就會作為單行結果集
自動返回給客戶
但是
如果過程必須給客戶提供行
則使用無游標的 SELECT 語句
更為有效
在每個 FETCH 之後
@@FETCH_STATUS 函數均被更新
它和 PL/SQL 中使用的 CURSOR_NAME%FOUND 和 CURSOR_NAME%NOTFOUND 變量用法類似
每次成功提取後
@@FETCH_STATUS 函數值被設為
如果該提取要讀取游標結尾之外的地方
則返回值
如果游標打開後
請求的行已被從表中刪除
則 @@FETCH_STATUS 函數返回
通常
返回值
只在使用 SCROLL 選項聲明的游標中出現
每次提取後
必須檢查該變量
以保證數據的有效性
SQL Server 不支持 Oracle 的游標 FOR 循環語法
在 PL/SQL 和 Transact
SQL 中
用於更新和刪除的 CURRENT OF 子句語法和函數是相同的
定位 UPDATE 或 DELETE 用於對指定游標內的當前行進行更新和刪除操作
Transact
SQL CLOSE CURSOR 語句關閉游標
但數據結構仍可用於重新打開游標
PL/SQL CLOSE CURSOR 語句關閉並釋放所有的數據結構
Transact
SQL 需要使用 DEALLOCATE CURSOR 語句
刪除游標數據結構
DEALLOCATE CURSOR 語句與 CLOS
From:http://tw.wingwit.com/Article/program/Oracle/201311/18843.html