首页  编辑  

迁移你的数据和应用程序


迁移你的数据和应用程序

这一部分提供了几种不同的方法用于从Oracle数据库迁移数据到Microsoft SQL Server数据库

使用数据转换服务(DTS)的数据迁移

在Oracle和SQL Server之间迁移的最简单的方法是使用Microsoft SQL Server 7.0中的数据转换服务(DTS)特征。DTS向导将引导你迁移数据到SQL Server。

Oracle调用接口(OCI)

如果你有一个以前用Oracle调用接口(OCI)写的应用程序,你也许会考虑用ODBC重写它们。OCI是专门用于Oracle数据库的,不能用于Microsoft SQL Server或者任何其他数据库。

在大多数情况下,你可以用适当的ODBC函数替代OCI函数,加上对支持的程序代码的适当的修改。而剩下的非OCI程序代码只需要做最小的修改。下面的示例说明了建立到Oracle数据库的连接所需要的OCI和ODBC语句的比较。

Oracle Call Interface

Oracle ODBC

rcl = olog(&logon_data_area, &host_data_area, user_name, -1, (text*)
0, -1, (text) 0, -1, OCI_LM_DEF);

rcl = SQLConnect(hdbc1,
(SQLCHAR*) ODBC_dsn, (SQLSMALLINT) SQL_NTS,
(SQLCHAR*) user_name, (SQLSMALLINT) SQL_NTS,
(SQLCHAR*) user_password, (SQLSMALLINT) SQL_NTS);

此表给出了在Oracle OCI函数调用和ODBC函数之间的转换的建议。这些建议的转换是近似的。在转换处理上也许没有一个确切的匹配。你的程序也许需要一些额外的修正以获得相似的功能。

OCI function

ODBC function

Obindps

SQLBindParameter

Obndra

SQLBindParameter

Obndrn

SQLBindParameter

Obndrv

SQLBindParameter

Obreak

SQLCancel

Ocan

SQLCancel, SQLFreeStmt

Oclose

SQLFreeStmt

Ocof

SQLSetConnectOption

Ocom

SQLTransact

Ocon

SQLSetConnectOption

Odefin

SQLBindCol

Odefinps

SQLBindCol

Odescr

SQLDescribeCol

Oerhms

SQLError

Oexec

SQLExecute, SQLExecDirect

Oexfet

SQLExecute, SQLExecDirect, and SQLFetch

Oexn

SQLExecute, SQLExecDirect

Ofen

SQLExtendedFetch

Ofetch

SQLFetch

Oflng

SQLGetData

Ogetpi

SQLGetData

Olog

SQLConnect

Ologof

SQLDisconnect

Oopen

SQLExecute, SQLExecDirect

Oparse

SQLPrepare

Orol

SQLTransact

嵌入的SQL

许多应用程序是用Oracle编程接口(Oracle Programmatic Interfaces)编写的(Pro*C、Pro*Cobol、等等)。这些接口支持SQL-92标准的嵌入式SQL的使用。它们还包括非标准的Oracle编程扩展。

Oracle嵌入式SQL应用程序可以用针对C开发环境的微软嵌入式SQL迁移到SQL Server。同一个ODBC应用程序相比,这个环境提供了足够的但不是最佳的性能控制和SQL Server特征的使用。

在微软的ESQL预编译器中,有一些Oracle Pro*C特征不被支持。如果你的Oracle应用程序广泛的应用了这些特征,为ODBC重写可能是一个比较好的迁移选择。这些特征包括:

  • Host数组变量
  • 数据类型等价的VAR和TYPE语句
  • 对C++模块的嵌入式SQL的支持
  • 对嵌入式PL/SQL或者Transact-SQL块的支持。
  • 游标变量
  • 多线程应用程序支持
  • 对Oracle通信域的支持(Oracle Communication Area,ORACA)

如果你的Oracle应用程序是用Cobol开发的,可以通过Micro Focus迁移到Embedded SQL for Cobol。你也许会在Cobol中碰到一些同Microsoft ESQL for C precompiler一样的限制。

你可以把你的Oracle嵌入式SQL应用程序转换到ODBC环境。这个迁移过程非常容易,并且有许多优点。在处理嵌入式SQL时,ODBC不需要使用预编译器。因此,许多同程序开发相关的管理开销被省掉了。

下表显示了嵌入式SQL语句和ODBC函数之间大致的关系。

Embedded SQL statement

ODBC function

CONNECT

SQLConnect

PREPARE

SQLPrepare

EXECUTE

SQLExecute

DECLARE CURSOR and OPEN CURSOR

SQLExecute

EXECUTE IMMEDIATE

SQLExecDirect

DESCRIBE SELECT LIST

SQLNumResultCols, SQLColAttributes, SQLDescribeCol

FETCH

SQLFetch

SQLCA.SQLERRD[2]

SQLRowCount

CLOSE

SQLFreeStmt

COMMIT WORK, ROLLBACK WORK

SQLTransact

COMMIT WORK RELEASE,
ROLLBACK WORK RELEASE

SQLDisconnect

SQLCA, SQLSTATE

SQLError

ALTER, CREATE, DROP, GRANT, REVOKE

SQLExecute, SQLExecDirect

把嵌入式SQL程序转换到ODBC的最明显的改变是处理SQL语句错误。MODE = ORACLE选项经常在开发嵌入式SQL程序时使用。当使用这个选项时,SQL通信域(SQL Communications Area ,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,则应用程序将调用这个函数(SQLError)。但是,热和ODBC函数都能在每次调用的时候传递0个或者更多的错误,因此应用程序必须在每次ODBC函数调用之后调用SQLError

这是一个在各自环境中进行错误处理的例子。

Oracle Pro*C and EMBEDDED SQL

Oracle ODBC

EXEC SQL DECLARE CURSOR C1
   CURSOR FOR SELECT SSN, FNAME,    LNAME FROM STUDENT ORDER BY SSN;
EXEC SQL OPEN C1;
if (sqlca.sqlcode) != 0 {
/* handle error condition,
look at sqlca.sqlerrm.sqlerrmc for error description...*/}

if (SQLExecDirect(hstmtl,
(SQLCHAR*)"SELECT SSN, FNAME,    LNAME FROM STUDENT ORDER BY    SSN", SQL_NTS) !=    SQL_SUCCESS) {
/* handle error condition, use SQLError
   for SQLSTATE details regarding error...*/}

开发者2000Developer 2000)和第三方应用程序

如果你用Oracle开发者2000开发过应用程序,并且希望把它用于SQL Server,考虑把它转换到Microsoft Visual Basic。Visual Basic是一个强有力的开发工具,并且能在两种数据库很好的工作。你还可以考虑使用Microsoft Visual Studio中的其它开发工具、或者PowerBuilder、SQL Windows,以及其它工具。

如果你不能立即从开发者2000上迁移,考虑使用到SQL Server的Oracle Gateway。它可以用做从Oracle到SQL Server的一个中间步骤。该网关允许Oracle RDBMS连接到SQL Server。所有请求的SQL Server数据被网关自动转换。从开发者2000应用程序的角度看,连接是透明的。SQL Server数据看起来是Oracle数据。在应用程序代码上只需要做很少的修改。

另一个中间步骤是直接在SQL Server上直接使用开发者2000应用程序。开发者2000可以同Oracle开放客户适配器(Oracle Open Client Adapter,OCA)直接访问SQL Server。OCA是ODBC一级兼容,并且有限兼容ODBC二级函数。

OCA建立一个到SQL Server ODBC驱动程序的连接。当连接开发者2000工具到SQL Server时,你必须指定一个ODBC数据源名字作为数据库连接字串的一部分。当你结束开发者2000连接时,到ODBC数据源的连接同时断开。

下面这个例子说明了登录连接字串的语法。在这个例子中,用户登录到SQL Server STUDENT_ADMIN账号。SQL Server ODBC数据源的名字是STUDENT_DATA

STUDENT_ADMIN/STUDENT_ADMIN@ODBC:STUDENT_DATA

使用ODBC驱动程序并不能确保一个开发者2000应用程序能在SQL Server上正确的工作。应用程序代码必须修正以同一个非Oracle数据源工作。例如,专门用于Oracle的列安全性属性在SQL Server中不起作用。

你必须修改用于标识每行数据的键模式。如果使用Oracle作为数据源,将用一个ROWID来标识每一行。当使用SQL Server时,你必须用唯一主键值(unique primary key)以确保唯一行值。

锁定模式也必须修改。当使用Oracle时,开发者2000试图在每次行改变以后立即锁定一行数据。而使用SQL Server,锁定模式可以设定一个延迟,以便只在记录要写入数据库时锁定它。

还有许多其他问题需要解决,包括如果在一个PL/SQL程序块中访问同一页数据时对同一个表的多个输入发生时,潜在的死锁的可能。要了解更多信息,请参看本文的“事务、锁定和并行”部分。

互联网应用程序

Microsoft SQL Server包括SQL Server Web Assistant,这是一个从SQL Server数据生成标准HTML文件的向导。该向导可以配置你的Web页,使它是静态的、周期性更新的或者一旦数据被更新就立即更新。向导将引导你完成创建Web页的全部过程。


image010.gif (2.0KB)