欢迎来到Java学习网!
设为首页 | 加入收藏
当前位置: 首页 > 数据库 > 数据库综合 >

  简介

  当使用来自于不同供应商的不同数据库系统时,用户和数据库管理员将不可避免地碰到在这些产品中各不相同的特性和功能。通常,可在以下方面发现这些差异:

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

  ◆数据库管理器应用程序界面。

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

  为了使得将数据库和应用程序从Oracle?、Sybase?或Microsoft?SQLServer等数据库产品迁移到IBM?DB2?UniversalDatabase?(UDB)更容易,本文将展示一些可行的DB2UDB功能实现,而且这些功能在其他数据库系统中也可获得。这些实现将涉及创建存储过程和用户定义函数(UDF)以实现那些常常被请求的功能。

  在“下载”小节中,您将找到这些过程和函数的源代码以及包含了CREATEPROCEDURE和CREATEFUNCTION语句的SQL脚本。如果您对确切的实现细节很感兴趣,就请查阅这些代码。一旦编译并链接了源代码(或安装了预编译的库)以及在数据库中注册了这些过程和函数之后,您就可以按本文实例所演示的那样来使用它们了。另外值得注意的是,这些过程和函数可用于DB2UDB版本7和版本8。

  清除表

  当从Oracle迁移到DB2时,所碰到的一个普遍问题就是TRUNCATE命令。在Oracle中执行时,该命令不用借助一个或多个DELETE操作就可快速地清除表中所有内容,DELETE操作需要进行大量的日志记录。

  DB2的IMPORT功能提供了完成相同功能的方法,只要使用REPLACEINTO子句以及将一个空文件指定为数据源。在该情况下,表中所有的行都将被快速清除并且只使用一条日志记录,接着就从给定的文件中导入新的数据。而对于一个空文件,就不会导入任何内容,从而在该操作结束时清除了该表。

  要实现该功能,我们可以利用DB2定义的叫做sqluimpr()的CAPI函数来以程序的方式将数据导入数据库的表中。我们将这个API包装到存储过程中,以便可通过SQL接口用于所有的应用程序,而无需考虑编程的语言。清单1中展示了存储过程TRUNCATE_TABLE的签名。

  清单1.过程TRUNCATE_TABLE的签名

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

  VARCHAR(130)类型的参数schema_name指定模式,用以在其中找到表。如果模式名外加了双引号,就将其看成定界名称(混合大小写的和特殊的字符)。如果模式名为空,即未指定模式,那么则要查阅CURRENTSCHEMA专用寄存器来确定所要使用的模式。VARCHAR(130)类型的参数table_name指定将被清除的表的未限定名称。加上显式或隐式定义的模式名就可惟一地识别出表。如果表名外加了双引号,就将其看成定界名称(混合大小写的和特殊的字符)。

  如果输入参数schema_name为空,则由该过程的逻辑来确定默认模式。否则,就删除现有模式名上的双引号,或者将未加引号的模式名转换为大写体。对于表名同样如此,比如最后表名上的双引号会被删除,或者未加引号的表名会被转换为大写体。接着,我们通过查询DB2目录视图SYSCAT.TABLES来证实该表是否存在。现在就可以启动导入了。先准备好必要的参数,其中使用的文件是/dev/null(Windows上的NUL文件),因为它总是存在并且不包含任何内容,也就是可用作数据源的空文件。同样,/dev/null(Windows上的NUL文件)将用于进行导入所需的消息文件。如果成功地启动了导入,该过程就会成功返回。如果碰到错误,则与消息文本一起返回SQLSTATE以指示错误。清单2演示了过程TRUNCATE_TABLE的执行。可以在“下载”小节中找到该脚本(truncate_example.db2)的源代码。

  清单2.测试过程TRUNCATE_TABLE

  /*createandinsertsomevaluesintothetabletab1*/

  CREATETABLEtab1(col1INTEGERNOTNULLPRIMARYKEY,col2VARCHAR(15))

  DB20000ITheSQLcommandcompletedsuccessfully.

  INSERTINTOtab1VALUES(1,'somedata'),(2,NULL)

  DB20000ITheSQLcommandcompletedsuccessfully.

    相关教程
    推荐内容