迁移数据和应用程序
本节阐述了,将数据从 Oracle 数据库迁移到 Microsoft SQL Server 数据库所使用的各种方法。
在 Oracle 和 SQL Server 之间迁移的最简单的方法是,使用 Microsoft SQL Server 7.0 中的数据转换服务 (DTS) 功能。DTS 向导指导您将数据移到 SQL Server。
如果应用程序是使用 Oracle 调用接口写成的,则可考虑使用 ODBC 重写。OCI 是 Oracle RDBMS 特有的,不能用于 Microsoft SQL Server 或其它数据库。
在大多数情况下,可以用相应 ODBC 函数代替 OCI 函数,并对支持程序代码进行相关的修改。剩下的非 OCI 程序代码应该只需要较小的修改。下例给出了,建立到 Oracle 数据库连接所需 OCI 和 ODBC 语句的对比。
该表建议了下面 Oracle OCI 函数调用和 ODBC 函数之间的转换。这些建议的转换是近似的。可能并不存在转换过程的精确匹配。要获得类似的功能,可能需要对程序代码作进一步修改。
许多应用程序是使用 Oracle 编程接口(Pro*C、Pro*Cobol 等等)写成的。这些接口支持 SQL-92 标准嵌入式 SQL。它们还包括非标准的 Oracle 编程扩展。
可以使用 Microsoft 用于 C 语言的嵌入式 SQL (ESQL) 开发环境,将 Oracle 嵌入式 SQL 应用程序迁移到 SQL Server。与 ODBC 应用程序相比,这个环境对性能和 SQL Server 功能的使用提供了充分的、但绝非最优的控制。
有些 Oracle Pro*C 功能在 Microsoft ESQL 预编译器中不予支持。如果 Oracle 应用程序要广泛使用这些功能,重写为 ODBC 可能是一个较好的迁移选择。这些功能包括:
宿主数组变量。
将数据类型同等化的 VAR 和 TYPE 语句。
C++ 模块中对嵌入式 SQL 的支持。
对嵌入式 PL/SQL 或 Transact-SQL 块的支持。
游标变量。
多线程应用程序支持。
Oracle 通信区域 (ORACA) 支持。
如果应用程序是用 Cobol 开发的,可以从 Micro Focus 迁移到用于 Cobol 语言的嵌入式 SQL。在 Cobol 中,可能会遇到与用于 C 语言的 Microsoft ESQL 预编译器相同的一些限制。
可以把 Oracle 嵌入式 SQL 应用程序转换到 ODBC 环境。这一迁移过程很简单,并且提供许多优势。ODBC 像嵌入式 SQL 一样,不需要使用预编译器。因此,就节省了许多与程序开发有关的费用。
下表给出了嵌入式 SQL 语句和 ODBC 函数的近似关系。
将嵌入式 SQL 程序转换为 ODBC 时,最大的改动是有关 SQL 语句错误的处理。开发嵌入式 SQL 程序时,常常使用 MODE=ORACLE 选项。当使用这个选项时,SQL 通信区域 (SQLCA) 通常用于错误处理操作。
SQLCA 结构提供:
Oracle 错误代码。
Oracle 错误信息。
警告标志。
关于程序事件的信息。
最近一个 SQL 语句处理的行数。
在大多数情况下,在每个 SQL 语句执行后,应该检查 sqlca.sqlcode 变量中的值。如果值小于 0,就出现错误。如果值大于 0,请求语句执行,但带有警告。可从 sqlca.sqlerrm.sqlerrmc 变量,检索 Oracle 错误信息文本。
在 ODBC 中,函数在请求操作之后,返回一个指示其成功或失败的数字状态代码。状态代码被定义为字符串文字,包括 SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_ERROR 等等。每次函数调用后,应检查这些返回值。
通过调用 SQLError 函数,可以获得关联的 SQLSTATE 值。此函数返回 SQLSTATE 错误代码、原本的错误代码(它是数据源所特有的错误代码)和错误信息文本。
当上一个 ODBC 函数调用返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,应用程序通常调用这个函数。但是,每次调用时,任何 ODBC 函数可能不发布错误或发布更多的错误,因此每次 ODBC 函数调用之后,应用程序可调用 SQLError。
以下是每种环境中错误处理的示例。
如果应用程序是使用 Oracle Developer 2000 开发的,并且要在 SQL Server 上运行,则考虑将其转换到 Microsoft Visual Basic。Visual Basic 是一个功能强大的开发系统,可很好地用于这两种数据库。也应考虑其它平台上的开发工具,如 Microsoft Visual Studio、PowerBuilder、SQL Windows 等等。
如果不能直接从 Developer 2000 迁移,则考虑使用 Oracle Gateway to SQL Server。它可以作为从 Oracle 向 SQL Server 迁移的中间步骤。这个“通路”允许 Oracle RDBMS 连接到 SQL Server。所有的 SQL Server 数据请求都经由这个“通路”自动地转换。从 Developer 2000 应用程序的角度看,这个连接是透明的。SQL Server 数据被视作 Oracle 数据处理。几乎不需要对应用程序代码进行修改。
另外一个中间步骤是,将 Developer 2000 应用程序直接用于 SQL Server。Developer 2000 可以使用 Oracle 开放客户适配器 (OCA) 直接访问 SQL Server。OCA 符合 ODBC Level 1 规范,并有限支持 ODBC Level 2 功能。
OCA 建立一个与 SQL Server ODBC 驱动程序的连接。当把 Developer 2000 工具连接到 SQL Server 时,必须将 ODBC 数据源名称指定为数据库连接字符串的一部分。当退出 Developer 2000 应用程序时,OCA 与 ODBC 数据源的连接被断开。
下面的示例给出了登录连接字符串的语法。在此例中,用户登录到 SQL Server STUDENT_ADMIN 帐户。SQL Server ODBC 数据源的名称是 STUDENT_DATA。
STUDENT_ADMIN/STUDENT_ADMIN@ODBC:STUDENT_DATA
使用 ODBC 驱动程序并不保证,Developer 2000 应用程序在 SQL Server 上使用正常。要处理非 Oracle 数据源,必须修改应用程序代码。例如,列的安全属性是 Oracle 特有的,对 SQL Server 无效。
必须修改用于标识每行数据的键模式。当使用 Oracle 作为数据源时,用 ROWID 标识每行数据。当使用 SQL Server 时,必须使用唯一主键值,来保证行值的唯一性。
锁定模式也必须更改。使用 Oracle 时,在对行进行任何更改后,Developer 2000 就会试图立即锁定那行数据。使用 SQL Server 时,锁定模式应该被设定为延迟的,这样,记录只在被写入数据库时才被锁定。
还有许多其它要解决的问题,包括在 PL/SQL 程序块中,如果一个表上的多个插入访问同一页数据,就会有产生死锁的可能性。有关详细信息,请参见本章前面介绍的“事务、锁定和并发性”部分。
Microsoft SQL Sever 包括 SQL Server Web 助手,它是一个从 SQL Server 数据中生成标准 HTML 文件的向导。此向导可以将 Web 页配置为静态的、定期更新的或当数据更新时更新。向导帮助您创建 Web 页。
数据库示例
一个示例的大学 RDBMS 应用程序已经创建,用于支持本章中通篇引用的示例应用程序和代码。这个应用程序是专门创建的,用于阐述将 Oracle 7 应用程序转换到 SQL Server 7.0 应用程序所涉及的要点、问题和窍门。
这个示例应用程序使用四个表,记录大学中的所有活动。DEPT 表用于记录大学所设的系。CLASS 表用于记录每个系开设的课程。STUDENT 表用于记录大学中每个学生的情况。GRADE 表用于记录每门课登记的学生。
在此示例应用程序中,社会安全号码 (ssn) 用作 STUDENT 表的主键。DEPT 表用系代码 (dept) 作为主键;而课程代码 (ccode) 用作 CLASS 表的主键。社会安全号码 (ssn) 和课程代码 (ccode) 组成 GRADE 表的主键。
列 major 定义为 STUDENT 表的外键。选择专业 (major) 时,学生必须从 DEPT 表中选择一个有效的系代码 (dept)。 CLASS 表中的系别 (dept) 一列也被定义为外键。当一门课程插入这个表中时,它必须和 DEPT 表中有效的系别 (dept) 联系起来。
GRADE 表有两个外键。当一个学生登记一门课程时,在 STUDENT 表中必须有其社会安全号码 (ssn);在 CLASS 表中必须有课程代码 (ccode)。这就保证了,学生不会登记表中不存在的课程,也不会允许表中不存在的学生来登记课程。
在本章中,对这些示例应用程序通篇引用。
Orademo.cpp
访问 Oracle 7.3 数据库中示例大学表的 Oracle ODBC 应用程序。这个程序是转换过程的起点。它允许用户对示例大学应用程序进行数据输入和制作报告。
Ssdemo.cpp
使用 ODBC 写成的 SQL Server 应用程序。这个程序是转换过程的终点。所有的 Oracle SQL 命令、过程、包和函数都已被转化为 SQL Server Transact-SQL 命令和过程。这个程序例证了许多和 SQL Server 7.0 有关的优点。
Common.cpp
可用于 Oracle 和 SQL Server 的 ODBC 应用程序。要连接到 Oracle 或 SQL Server,用户只要提供 ODBC 数据源名称 (DSN) 即可。该程序然后登录到请求的 RDBMS。该程序包括编程技巧方面的一些极好示例,可供开发多 RDBMS 程序时使用。
Orauser.sql
创建示例 Oracle 程序所需的数据库用户帐户和数据库角色。
Oratable.sql
创建示例 Oracle 程序所需的表和视图。
Oraproc.sql
创建示例 Oracle 程序所需的存储过程、函数和包。
Oracommn.sql
创建支持 Common.