熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle 數據庫向 MS SQL Server 7.0 的遷移(4)

2013-11-13 22:21:01  來源: Oracle 

  聲明變量
  TransactSQL 和 PL/SQL 變量是使用 DECLARE 關鍵字來創建的TransactSQL 變量用 @ 來標識並且像 PL/SQL 變量一樣第一次創建時該變量被初始化為空值
   
  TransactSQL 不支持 %TYPE 和 %ROWTYPE 變量數據類型定義在 DECLARE 命令中不能對 TransactSQL 變量進行初始化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 TransactSQL 支持使用 BEGINUEND 術語來指定程序塊TransactSQL 不要求在 DECLARE 語句後面使用語句塊在 Microsoft SQL Server 中如果 IF 語句和 WHILE 循環執行不止一個語句需要使用 BEGINUEND 語句塊
   
  條件處理
  Microsoft SQL Server TransactSQL 條件語句包含 IF 和 ELSE 語句而不是 Oracle PL/SQL 中的 ELSIF 語句可以嵌套多個 IF 語句來達到同樣的效果對於大量的條件測試CASE 表達式更容易閱讀
   
  重復的語句執行(循環)
  Oracle PL/SQL 提供了無條件的 LOOP 和 FOR LOOP而 TransactSQL 則提供了 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 語句TransactSQL 批處理執行就會跳到標號處GOTO 語句和標號之間的語句不執行
  
   
  
  PRINT 語句
  TransactSQL PRINT 語句和 PL/SQL RDBMS_OUTPUTput_line 過程所執行的操作相同它用於打印用戶指定的消息
  
  PRINT 語句的消息限度為 個字符使用 char 或 varchar 數據類型定義的變量可以嵌入打印語句中如果使用了任何其它數據類型必須使用 CONVERT 或 CAST 函數可以打印局部變量全局變量和文本可用單引號和雙引號將文本括上
  
  從存儲過程返回
  Microsoft SQL Server 和 Oracle 均有 RETURN 語句使用 RETURN 語句程序可從查詢或過程無條件退出RETURN 是一條可立即執行的完整語句並可在任何時候用於從過程批處理或語句塊中退出RETURN 後面的語句均不執行
  
   
  
  提出程序錯誤
  TransactSQL 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 異常錯誤處理程序而 TransactSQL 程序什麼也不使用加入 raise_application_error 異常錯誤處理程序可避免 PL/SQL 程序返回二義性的 unhandled exception 錯誤信息相反當發生意外問題時它總是返回 Oracle 錯誤信息 (SQLERRM)
  
  當 TransactSQL 程序失敗時它總是給客戶程序返回詳細的錯誤信息因此除非需要進行專門錯誤處理否則並不總是需要 RAISERROR 語句
  
   
  
  游標的實現
  不管從數據庫中請求行數的多少Oracle 始終要求游標和 SELECT 語句一起使用在 Microsoft SQL Server 中未包含在游標內的 SELECT 語句把行作為默認結果集返回給客戶這是一種將數據返回給客戶程序的有效方法
  
  SQL Server 給游標函數提供了兩個接口當在 TransactSQL 批處理或存儲過程時使用游標時SQL 語句可用來聲明打開游標和從游標以及定位更新和刪除中提取當使用來自 DBLibraryODBC 或 OLE DB 的游標時SQL Server 客戶機庫透明地調用內置的服務器函數以更有效地處理游標
  
  當從 Oracle 導入 PL/SQL 過程時首先確定游標是否需要執行和 TransactSQL 中相同的功能如果游標只給客戶程序返回一組行則使用 TransactSQL 中無游標的 SELECT 語句返回一個默認的結果集如果使用游標向局部過程變量每次加載一行數據則必須使用 TransactSQL 中的游標
  
  下表給出了游標的使用語法
  
   
  
  盡管 TransactSQL DECLARE CURSOR 語句不支持使用游標參數但它的確支持局部變量當游標打開時這些局部變量的值可在游標中使用Microsoft SQL Server 在其 DECLARE CURSOR 語句中提供了許多額外的功能
  
  INSENSITIVE 選項用於定義游標使之創建一個要使用的數據的臨時副本對游標的所有請求均由此臨時表應答因此對基表的修改不會反映在對該游標提取所返回的數據中這種類型游標訪問的數據不能被修改
  
  應用程序可以請求一種游標類型然後執行一條不被所請求類型服務器游標支持的 TransactSQL 語句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 不同在一個游標打開時TransactSQL 不支持向該游標傳遞參數當 TransactSQL 游標打開時結果集成員身份和次序是固定的對於其他用戶已提交的對基表的更新和刪除均會反映在所有未使用 INSENSITIVE 選項定義的游標提取中對於 INSENSITIVE 游標還會生成一個臨時表
  
  Oracle 游標只能向前移動不能向後或相對滾動SQL Server 可以使用下表所示的提取選項向前和向後滾動只有當游標使用 SCROLL 選項聲明時這些提取選項才可以使用
  
   
  
  TransactSQL 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 和 TransactSQL 中用於更新和刪除的 CURRENT OF 子句語法和函數是相同的定位 UPDATE 或 DELETE 用於對指定游標內的當前行進行更新和刪除操作
  
  TransactSQL CLOSE CURSOR 語句關閉游標但數據結構仍可用於重新打開游標PL/SQL CLOSE CURSOR 語句關閉並釋放所有的數據結構
  
  TransactSQL 需要使用 DEALLOCATE CURSOR 語句刪除游標數據結構DEALLOCATE CURSOR 語句與 CLOS
From:http://tw.wingwit.com/Article/program/Oracle/201311/18843.html
  • 上一篇文章:

  • 下一篇文章:
  • Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.