国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

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

2024-08-31 00:52:03
字體:
來源:轉載
供稿:網友

  聲明變量
  Transact-SQL 和 PL/SQL 變量是使用 DECLARE 要害字來創建的。Transact-SQL 變量用 @ 來標識,并且像 PL/SQL 變量一樣,第一次創建時該變量被初始化為空值。
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(4)(圖一)
  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 數據庫向 MS SQL Server 7.0 的遷移(4)(圖二)
  語句塊
  Oracle PL/SQL 和 Microsoft SQL Server Transact-SQL 支持使用 BEGINUEND 術語,來指定程序塊。Transact-SQL 不要求在 DECLARE 語句后面使用語句塊。在 Microsoft SQL Server 中,假如 IF 語句和 WHILE 循環執行不止一個語句,需要使用 BEGINUEND 語句塊。
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(4)(圖三)
  條件處理
  Microsoft SQL Server Transact-SQL 條件語句包含 IF 和 ELSE 語句,而不是 Oracle PL/SQL 中的 ELSIF 語句。可以嵌套多個 IF 語句,來達到同樣的效果。對于大量的條件測試,CASE 表達式更輕易閱讀。
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(4)(圖四)
  重復的語句執行(循環)
  Oracle PL/SQL 提供了無條件的 LOOP 和 FOR LOOP。而 Transact-SQL 則提供了 WHILE 循環和 GOTO 語句,來達到循環的目的。
  
  WHILE Boolean_eXPRession
  {sql_statement statement_block}
  [BREAK] [CONTINUE]
  
  
  對于一個或多個語句的重復執行,WHILE 循環測試一個布爾表達式。只要給定的表達式求值為 TRUE,語句就會重復執行。假如要執行多個語句,它們必須放在一個 BEGINUEND 塊中。
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(4)(圖五)
  
  可以使用 BREAK 和 CONTINUE 要害字,從循環的內部控制語句的執行。BREAK 要害字導致從 WHILE 循環中無條件退出,CONTINUE 要害字使 WHILE 循環跳過后面的語句,并重新開始循環。BREAK 要害字和 Oracle PL/SQL EXIT 要害字等同。Oracle 沒有 CONTINUE 的對等要害字。
  
  GOTO 語句
  Oracle 和 Microsoft SQL Server 均有 GOTO 語句,但是語法不同。碰到 GOTO 語句,Transact-SQL 批處理執行就會跳到標號處。GOTO 語句和標號之間的語句不執行。
  
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(4)(圖六)
  
  PRINT 語句
  Transact-SQL PRINT 語句和 PL/SQL RDBMS_OUTPUT.put_line 過程所執行的操作相同。它用于打印用戶指定的消息。
  
  PRINT 語句的消息限度為 8,000 個字符。使用 char 或 varchar 數據類型定義的變量可以嵌入打印語句中。假如使用了任何其它數據類型,必須使用 CONVERT 或 CAST 函數。可以打印局部變量、全局變量和文本。可用單引號和雙引號將文本括上。
  
  從存儲過程返回
  Microsoft SQL Server 和 Oracle 均有 RETURN 語句。使用 RETURN 語句,程序可從查詢或過程無條件退出。RETURN 是一條可立即執行的完整語句,并可在任何時候用于從過程、批處理或語句塊中退出。RETURN 后面的語句均不執行。
  
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(4)(圖七)
  
  提出程序錯誤
  Transact-SQL RAISERROR 語句返回一個用戶定義的錯誤信息,并設定一個系統標志,來記錄已發生了一個錯誤。
它和 PL/SQL raise_application_error 異常錯誤處理程序的功能相似。
  
  RAISERROR 語句答應客戶從 sysmessages 表檢索一個條目,或使用用戶定義的嚴重性和狀態信息動態地創建一條消息。定義后,此消息作為服務器錯誤信息返回給客戶。
  
  RAISERROR ({msg_id msg_str}, severity, state
  [, argument1 [, argument2]])
  [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 數據庫向 MS SQL Server 7.0 的遷移(4)(圖八)
  
  游標的實現
  不管從數據庫中請求行數的多少,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 中的游標。
  
  下表給出了游標的使用語法。
  
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(4)(圖九)
  
  盡管 Transact-SQL DECLARE CURSOR 語句不支持使用游標參數,但它的確支持局部變量。當游標打開時,這些局部變量的值可在游標中使用。Microsoft SQL Server 在其 DECLARE CURSOR 語句中提供了許多額外的功能。
  
  INSENSITIVE 選項用于定義游標,使之創建一個要使用的數據的臨時副本。對游標的所有請求均由此臨時表應答。因此,對基表的修改不會反映在對該游標提取所返回的數據中。這種類型游標訪問的數據不能被修改。
  
  應用程序可以請求一種游標類型,然后執行一條不被所請求類型服務器游標支持的 Transact-SQL 語句。SQL Server 就會返回一個錯誤,指出游標類型已經更改;或者如給定了一組要素,SQL Server 就會隱式轉換游標。有關使 SQL Server 7.0 隱式地將游標從一種類型轉換到另一種類型的完整要素列表,請參見 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 選項聲明時,這些提取選項才可以使用。
  
   Oracle 數據庫向 MS SQL Server 7.0 的遷移(4)(圖十)
  
  Transact-SQL FETCH 語句不需要 INTO 子句。假如沒有指定返回變量,該行就會作為單行結果集,自動返回給客戶。但是,假如過程必須給客戶提供行,則使用無游標的 SELECT 語句,更為有效。
  
  在每個 FETCH 之后,@@FETCH_STATUS 函數均被更新。
它和 PL/SQL 中使用的 CURSOR_NAME%FOUND 和 CURSOR_NAME%NOTFOUND 變量用法類似。每次成功提取后,@@FETCH_STATUS 函數值被設為 0。假如該提取要讀取游標結尾之外的地方,則返回值 -1。假如游標打開后,請求的行已被從表中刪除,則 @@FETCH_STATUS 函數返回 -2。通常,返回值 -2 只在使用 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莱州市| 益阳市| 射洪县| 宁安市| 长子县| 响水县| 禄丰县| 金川县| 湛江市| 长汀县| 松阳县| 大埔区| 海口市| 庆元县| 余干县| 永宁县| 石嘴山市| 文成县| 古田县| 涞源县| 桐城市| 分宜县| 茌平县| 深水埗区| 来凤县| 绥棱县| 南昌县| 塔城市| 和龙市| 德惠市| 应城市| 玉龙| 多伦县| 灵丘县| 乡宁县| 诏安县| 睢宁县| 正阳县| 曲靖市| 成都市| 车险|