程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 淺談IBM DB2數據庫如何遷移問題(1)

淺談IBM DB2數據庫如何遷移問題(1)

編輯:關於SqlServer


  簡介
  當使用來自於不同供應商的不同數據庫系統時,用戶和數據庫管理員將不可避免地碰到在這些產品中各不相同的特性和功能。通常,可在以下方面發現這些差異:

  ◆受支持的 SQL 方言中的不同語法。

  ◆數據庫管理器應用程序界面。

  ◆不同的管理工具及其用法。

  為了使得將數據庫和應用程序從 Oracle?、Sybase? 或 Microsoft? SQL Server 等數據庫產品遷移到 IBM? DB2? Universal Database?(UDB)更容易,本文將展示一些可行的 DB2 UDB 功能實現,而且這些功能在其他數據庫系統中也可獲得。這些實現將涉及創建存儲過程和用戶定義函數(UDF)以實現那些常常被請求的功能。

  在“下載”小節中,您將找到這些過程和函數的源代碼以及包含了 CREATE PROCEDURE 和 CREATE FUNCTION 語句的 SQL 腳本。如果您對確切的實現細節很感興趣,就請查閱這些代碼。一旦編譯並鏈接了源代碼(或安裝了預編譯的庫)以及在數據庫中注冊了這些過程和函數之後,您就可以按本文實例所演示的那樣來使用它們了。另外值得注意的是,這些過程和函數可用於 DB2 UDB 版本 7 和版本 8。

  清除表

  當從 Oracle 遷移到 DB2 時,所碰到的一個普遍問題就是 TRUNCATE 命令。在 Oracle 中執行時,該命令不用借助一個或多個 DELETE 操作就可快速地清除表中所有內容, DELETE 操作需要進行大量的日志記錄。

  DB2 的 IMPORT 功能提供了完成相同功能的方法,只要使用 REPLACE INTO 子句以及將一個空文件指定為數據源。在該情況下,表中所有的行都將被快速清除並且只使用一條日志記錄,接著就從給定的文件中導入新的數據。而對於一個空文件,就不會導入任何內容,從而在該操作結束時清除了該表。

  要實現該功能,我們可以利用 DB2 定義的叫做 sqluimpr() 的 C API 函數來以程序的方式將數據導入數據庫的表中。我們將這個 API 包裝到存儲過程中,以便可通過 SQL 接口用於所有的應用程序,而無需考慮編程的語言。清單 1 中展示了存儲過程 TRUNCATE_TABLE 的簽名。

  清單1. 過程 TRUNCATE_TABLE的簽名

  >>--TRUNCATE_TABLE--(--schema_name--,--table_name--)--------><

  VARCHAR(130) 類型的參數 schema_name 指定模式,用以在其中找到表。如果模式名外加了雙引號,就將其看成定界名稱(混合大小寫的和特殊的字符)。如果模式名為 空 ,即未指定模式,那麼則要查閱 CURRENT SCHEMA 專用寄存器來確定所要使用的模式。 VARCHAR(130) 類型的參數 table_name指定將被清除的表的未限定名稱。加上顯式或隱式定義的模式名就可惟一地識別出表。如果表名外加了雙引號,就將其看成定界名稱(混合大小寫的和特殊的字符)。

  如果輸入參數 schema_name 為 空 ,則由該過程的邏輯來確定默認模式。否則,就刪除現有模式名上的雙引號,或者將未加引號的模式名轉換為大寫體。對於表名同樣如此,比如最後表名上的雙引號會被刪除,或者未加引號的表名會被轉換為大寫體。接著,我們通過查詢 DB2 目錄視圖 SYSCAT.TABLES 來證實該表是否存在。現在就可以啟動導入了。先准備好必要的參數,其中使用的文件是 /dev/null(Windows 上的 NUL 文件),因為它總是存在並且不包含任何內容,也就是可用作數據源的空文件。同樣,/dev/null(Windows 上的 NUL 文件)將用於進行導入所需的消息文件。如果成功地啟動了導入,該過程就會成功返回。如果碰到錯誤,則與消息文本一起返回 SQLSTATE 以指示錯誤。清單 2 演示了過程 TRUNCATE_TABLE 的執行。可以在“下載”小節中找到該腳本( truncate_example.db2)的源代碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved