




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Sybase移植的具体实现目 录1 导言1.1 目的1.2 范围1.3 参考资料1.4 版本更新记录2 概述3 前端应用的移植3.1 PowerBuilder应用程序移植3.2 嵌入SQL移植3.3 API调用移植4 服务器端的移植4.1 初始数据库安装4.2 创建数据库对象4.3 T-SQL语句4.4 编程结构4.5 事务处理4.6 存储过程4.7 触发器4.8 光标1. 导言1. 1目的 本文档是在Oracle移植到Sybase一文对Oracle和Sybase的不同点的说明基础上,结合“本地网计费”软件的具体实现而编写的。目的根据现有系统在Oracle上的具体实现,形成一个移植到Sybase环境的详细设计和规范,既作为程序开发人员具体编码实现的参考,又作为程序移植的指导性文档。 本文档在讨论移植过程的基础上,力求重点突出程序移植的具体实现,并针对在移植过程中经常用到的结构,形成一个标准的框架,以减少程序移植的工作量,规范移植过程。1.2范围1. 3参考资料1 . 中鲁公司:中鲁本地电信业务计费帐务系统数据库设计说明书2 . 中鲁公司:Oracle移植到Sybase的说明1. 4版本更新记录版本/修订版日期修改记录备注1.02000.03.10初始版本2. 概述 “本地网计费”软件的移植过程主要包括前端应用程序的移植和服务器端的移植两部分工作。该软件客户端使用的开发工具有:Powerbuilder、Delphi、C等。无论是用Powerbilder、Delphi编写的应用还是C语言中的嵌入SQL,移植的主要问题仍然是Oracle和Sybase的SQL语句的转换问题。具体来说,包括:1) Powerbuilder、Delphi编写的前端应用的转换。2) Oracle的Pro *c嵌入SQL到Sybase的ESQL/C的转换。 服务器端的移植主要从:初始数据库安装、创建数据库对象、T-SQL语句、基本编程结构、存储过程和触发器编写等几个方面来说明。对于经常用到的结构,提供出标准的框架。3. 前端应用的移植31Powerbuilder应用程序的移植Powerbuilder编写的应用的在移植时,需要考虑静态数据窗口和嵌入SQL的转换问题。从本质上讲,静态数据窗口嵌入了一个SQL语句。对于静态数据窗口,可以考虑将语法导出,根据Sybase环境下的规定,改写SQL语句,然后连接Sybase的数据库,将数据窗口导入,重新编译。数据窗口语法转换的工作,可以根据Powerbuilder中数据窗口的语法存储,写一个转换程序,在Powerbuilder源程序库中定位到数据窗口,修改其语法,再写入文件,这可以代替相当一部分手工工作。嵌入SQL的转换,将Oracle上的书写形式,按Sybase下的要求改写。对于Powerbuilder应用程序的移植,需要注意的是:1) 本软件移植到Sybase后,所有的数据库对象,包括:表、列、视图、索引均采用大写,在改写时需要替换。2) 注意数据窗口对应列从Oracle移植到Sybase后的数据类型的转换。数据类型的转换根据创建表时的定义。3) 外部数据源的数据窗口注意每个列的数据类型是否和Sybase相匹配。4) 改写SQL语句要注意Oracle到Sybase的系统函数的转换,系统函数的转换参见Oracle移植到Sybase中的有关说明。常见的例如:Oracle中两个字符串的连接操作使用“|”或concat函数,在Sybase上使用“+”。5) 如果SQL语句中使用了外连接,注意Oracle和Sybase外连接的表达形式的不同。Sybase不支持Oracle联合操作中的交集(INTERSECT)和差集(MINUS)语句,可以改写为由Exists引出的相关子查询。SQL语句的转换的实例参见在4.3查询SQL语句中说明的框架。6) 在Sybase上能使用连接的地方尽可能把子查询改写为等价的连接,以提高查询的执行效率。7) 在Powerbuilder下事务的控制是使用变量:sqlca.AutoCommit来实现的:sqlca.AutoCommit=False -/开始一个事务。 -/中间的事务处理过程if sqlca.sqlcode0 then -/事务中语句执行失败,回滚 rollback; 。 -/其它错误处理end ifcommit; -/整个事务执行成功提交或者:string vsSqlvsSql=begin tran t1 -/开始一个事务Execute Immediate :vsSql;。 -/中间的事务处理过程if sqlca.sqlcode0 save tran ts else begin tran ts insert into SEQ_ORDER_SERIAL_NBR values() select vid=ID from SEQ_ORDER_SERIAL_NBR rollback tran ts returnendgo-/以下是使用序列时的方法:declare vl_serial_nbr numeric(18,0)exec PR_SEQ_ORDER_SERIAL_NBR vl_serial_nbr output5. 表列的其他属性Oracle创建表时,如果表列不指定空值的属性,缺省为列可以为空(NULL),Sybase缺省为列不可以为空(NOT NULL),因些建表时应显示的指定空值属性。在Oracle上,字符类型的空串和NULL是等价的,而Sybase上等价于空格组成的字符串,在进行字符串比较时需要注意,例如:Where = 在Sybase为真,在Oracle上为假。6. 索引的转换1) Sybase的索引分为聚集索引(clustered)和非聚集索引(nonclustered),索引的命名应符合Sybase对象名的有关规定,移植时一般不需要改变。2) 对于表定义的主键约束(Primary key),系统缺省的自动生成一个唯一的聚集索引,对于唯一性约束,系统缺省的自动生成一个唯一的非聚集索引。在指定表和索引的存储参数时,表和聚集索引必须在同一个段上(segment)。3) 一般来说,一个表应有且只能有一个聚集索引,这个索引可以通过表的主键约束定义来产生。4) 表的索引设计还要根据应用程序的实际处理需要来修改。7. Oracle表和索引的存储参数的转换Sybase不象Oracle一样在创建表和索引时,指定初始存储空间大小,增长区间等参数,一般只需要在创建表和索引时指定表和索引所处的段即可。如:If exists (select 1 from sysobjects where type=U and name=ACCT_ITEM_TYPE) drop table ACCT_ITEM_TYPEgocreate table ACCT_ITEM_TYPE(ACCT_ITEM_TYPE_ID NUMERIC(6) NOT NULL, NAME VARCHAR(40) NOT NULL, STANDARD_CODE CHAR(6) NULL, INTERNAL_CODE VARCHAR(6) NULL, SUMMARY_ITEM_ID NUMERIC(6) NULL, DISCT_TYPE NUMERIC(1) NULL, ADJUST_TYPE NUMERIC(1) NULL,CONSTRAINT PK_ACCT_ITEM_TYPE PRIMARY KEY(ACCT_ITEM_TYPE_ID) ON LATN_DATAgocreate index INDEX_SUMMARY_ITEM_ID on ACCT_ITEM_TYPE(SUMMARY_ITEM_ID) on LATN_IDXgo create index IND_ACCT_ITEM_CODE on ACCT_ITEM_TYPE(INTERNAL_CODE,DISCT_TYPE)on LATN_IDXgo8. 数据完整性约束在Sybase上的实现数据完整性包括:实体完整性、域完整性和参照完整性。1) 实体完整性(Entity Integrity)在Sybase上可以通过主键约束(Primary Key)、唯一性约束(Unique Constraint)和唯一的索引来实现。有关主键、唯一索引和唯一性约束已在Oracle移植到Sybase中说明。需要注意的是:在创建实体完整性约束时,为了使用方便,要为约束进行命名,命名规则和其他数据库对象命名规则一样。2) 域完整性约束(Domain Integrity)在Sybase上域完整性约束可以通过缺省值、检查约束、空值约束、外键约束来实现。3) 参考完整性(Referential Integrity)参照完整性实现的规则是:n 当对含有外键的表(从表)进行插入、更新操作时,必须检查新行中外键的值,是否在以该外键作为主键的表(主表)中存在。如果不存在,就不能执行该操作或作某种特定处理。这一点可以通过创建表时的主/外键约束来实现,也可以通过触发器来实现。例如:if exists (select 1 from sysobjects where type=U and naem=PUBLISHERS) drop table PUBLISHERSgocreate table PUBLISHERS(PUB_ID char(4) not null, PUB_NAME varchar(60) not null, Constraint PK_PUBLISHERS primary key (PUB_ID)goif exists (select 1 from sysobjects where type=U and naem=TITLES) drop table TITLESgocreate table TITLES(TITLE_ID numerid(9,0) not null, TITLE varchar(60) null, PUB_ID char(4) not null, Constraint FK_PUB_ID foreign key (PUB_ID) References PUBLISHERS(PUB_ID)go有关触发器的实现可以参见本文档“4.7触发器”中的有关描述。n 当对被参照的表(主表)的行进行删除、更新操作时,必须检查被删除的行或被更新的行中主键的值是否正被从表引用,若被引用,不能执行该操作或作某种特定处理,比如:级联的删除(更新)从表。Sybase系统不支持主/外键关系的级联删除、更新的定义,可以通过触发器来实现,参见本文档“4.7触发器”中有关描述。9. Oracle同义词(synonyms)的转换在Sybase上是不支持同义词(synonyms)的引用的,在移植时根据同义词的具体使用用途来作相应的转换:1) 如果同义词是只是一般性的别名的作用,则可以去掉同义词的引用。2) 如果同义词中使用dblink代表一个远程服务器上的表、存储过程等数据库对象,则可以改为使用Sybase的组件集成服务中的代理表和远程过程调用,引用时直接引用代理表表名,和远程过程名(服务器名.数据库名.用户名.过程名,数据库名和用户名可以使用缺省设置,如:exec nt1proc_rpc)。有关Sybase组件集成服务和远程过程调用,可以参见SYBASE的技术手册。10. 表分割和视图的有关问题1) 基于性能和程序实现上的需要,系统中使用了表分割的方法,表分割分为:水平分割(分割行)和垂直分割(分割列)。垂直分割的组合可以使用视图来实现。水平分割的组合由于Sybase不支持视图的合并(UNION),所以Oralce上凡使用UNION语句来创建视图,在SYBASE上都要做相应的修改,具体可以根据需要改为直接在查询语句(SELECT)中使用UNION或使用临时表。2) 视图的查询语句的转换参见以下“4.2.T-SQL语句”中查询语句转换的有关说明。3) 视图移植的例子如果创建视图的查询语句使用了Oracle上的DECODE函数,可以使用Sybase T-SQL的CASE.WHEN语句来等价的实现。If exists (select 1 from sysobjects where type=V and name=STUDENT_GPA) drop view STUDENT_GPAgocreate view STUDENT_GPA (SSN,GPA)asselect SSN,round(avg(case GRADEwhen A then 4when A+ then 4.3when A- then 3.7when B then 3when B+ then 3.3when B- then 2.7when C then 2when C+ then 2.3when C- then 1.7when D then 1when D+ then 1.3when D- then 0.7else 0end),2)from GRADEgroup by SSN移植时注意Oracle的Create or replace view语句改为if exists.drop .create创建数据库对象的标准结构。43T-SQL语句1. 查询语句(SELECT)查询语句转换到Sybase上时,需要注意以下几个问题:1) 查询语句表达式中运算符和函数的转换,如:字符串连接由“|”替换为“+”等,函数的转换参见Oracle移植到Sybase中的有关说明。2) Oracle上集合语句中的交集(INTERSECT)和差集(MINUS)的转换,如:INTERSECT语句改写为:select CCODE,CNAME from CLASS cwhere exists (select 1 from GRADE gwhere c.CCODE = g.CCODE)MINUS语句改写为:select CCODE,CNAME from CLASS cwhere not exists (select 1 from GRADE gwhere c.CCODE = g.CCODE)3) Oracle中CONNECT BYSTART WITH子句引出的递归查询的转换。4) 连接操作中外连接的表示,由“(+)”换成“*”,并由等号的一方换到另一方。参见Oracle移植到Sybase中有关说明。5) 能用连接的地方,尽可能将子查询改写为等价的连接形式,以提高语句的处理速度。2. 插入语句(INSERT)、更新语句(UPDATE)和删除语句(DELETE)参见Oracle移植到Sybase中有关说明,需要注意的是Sybase在UPDATE和DELETE语句中均支持表的连接操作。45事务处理 SYBASE下的事务处理有两种方式:链接事务模式和非链接事务模式,服务器端缺省的事务模式为非链接事务模式。1) 在非链接事务模式下,除非显示的使用begin tran 语句开始一个事务,否则系统将每个SQL语句作为一个事务来处理,即系统在每执行完一个SQL语句,自动提交或回滚(SQL语句执行成功提交,失败回滚)。在非链接事务模式下,事务还允许嵌套,即一个事务嵌套在另一个事务中,如:begin tran -/开始事务update titles set price=price*1.1 from titleswhere pub_id=1234begin tran -/事务嵌套update tot;es set advance=advance*1.15 where pub_id in (select pub_id from publishers where state=MA)commit tran -/1delete titles where type=UNDECIDEDcommit tran -/2 在上述程序中,所有的修改只有最后一个commit tran执行后,才一起提交。在每个会话中,均有一个全局变量trancount来保存当前事务处理嵌套级别,实际的修改工作只有在trancount重新为零时正式提交,以下是各种事务处理语句对trancount的影响:begin tran trancount=trancount+1commit tran trancount=trancount-1save tran (无影响)rollback tran trancount=0rollback triggerrollback tran save_name (无影响)2) 在链接事务模式下,消除了事务处理嵌套,每个SQL语句检索(SELECT)或数据修改(INSERT、UPDATE、DELETE)语句开始随后需用COMMIT语句结束或ROLLBACK取消的事务处理,这和ORACLE的事务处理模式是相同的。3) 有关事务模式的详细内容,参见SYBASE参考手册。46存储过程1. 存储过程在移植到Sybase上时,需要考虑:1) 存储过程的命名。对存储过程的命名符合Sybase的数据库对象的命名规则和约定,要求存储过程名称为大写,不得超过30个字符,尽可能保持Oracle上的原名。2) 存储过程创建的标准写法。if exists (select 1 from sysobjects where type=P and name=P_PROC1) drop proc P_PROC1gocreate proc P_PROC1as.goSybase不支持Oracle的create or replace语句,删除存储过程和创建存储过程的语句分别作为一个批来书写。3) 存储过程的主体。存储过程的主体一般包括:变量定义、变量赋值、处理单元、条件判断、循环、出错处理,过程返回等处理。有关内容可以参考基本编程结构和查询语句中的说明。需要特别注意的是存储过程中的事务处理控制和错误处理的实现,这要根据具体的程序来考虑。4) 存储过程的调用。SYBASE下存储过程调用语句是:execute procedure proc_name arg1,arg2 output。对于输出参数,在调用时要使用变量,并加关键字output。 5) 有关存储过程的其它内容,参见SYBASE参考手册。47触发器1. 触发器(Trigger)是一种特殊的存储过程,在本系统中数据库触发器一般被用来实现:1) 实现复杂的数据完整性规则,例如:主/外键关系的完整性检查和约束,当删除或更新主表(主键所对应的表)的记录时,可以级联的删除或更新从表(外键对应的表)记录,或者禁止删除和更新被从表引用了的主表记录。当向从表插入或更新记录时,禁止相应主表的主键列中不存在的外键值。2) 同步实时的复制数据。3) 实现高级形式的业务规则或复杂行为限制。4) 实现数据库安全性或跟踪用户对数据库操作的审计功能。2. 触发器在移植到Sybase上时,需要考虑:6) 触发器的命名:对触发器的命名符合Sybase的数据库对象的命名规则和约定,要求触发器名称为大写,不得超过30个字符,尽可能保持Oracle上的原名。7) 触发器创建的标准写法:if exists (select 1 from sysobjects where type=TR and name= TR_US_METER_METER_MID_DEL) drop trigger TR_US_METER_METER_MID_DELgocreate trigger TR_US_METER_METER_MID_DELon USAGE_CHARGE_METER_MID for deletedas delete from METER_READING_MID where METER_READING_MID. METER_READING_ID = deleted. METER_READING_MIDgoSybase不支持Oracle的create or replace语句,删除触发器和创建触发器的语句分别作为一个批来书写。8) Sybase不支持Oracle上的BEFORE触发器,需要进行写,一般来说,如果触发器的任务是数据完整性的维护,改写为语句执行后的判断,不符合某些条件时,对当前事务进行回滚处理可以完成与BEFORE触发器等价的功能。9) Sybase上的inserted和deleted表保存了触发触发器的DML语句所修改的行,Sybase不区分语句级还是行级触发器,所以inserted或deleted表可能是多行记录,修改的记录数保存在全局变量rowcount中。3. 触发器的应用举例1) 实现级联删除(cascade delete)if exists (select 1 from sysobjects where type=TR and name=TR_US_CHARGE_LOCAL_MID_T01_DEL) drop trigger TR_US_CHARGE_LOCAL_MID_T01_DELgocreate trigger TR_US_CHARGE_LOCAL_MID_T01_DELon US_CHARGE_LOCAL_MID_T01 for deleteasdelete from CALL_TICKET_LOCAL_MID_T01where CALL_TICKET_LOCAL_MID_T01.TICKET_ID = deleted.TICKET_IDgo2) 实现相关的更新if exists (select 1 from sysobjects where type=TR and name= TR_EXCHANGE_UPD) drop trigger TR_EXCHANGE_UPDgocreate trigger TR_EXCHANGE_UPDon EXCHANGE for updateas if update (AREA_ID)update STAT_EXCHANGE set AREA_ID=inserted. AREA_IDwhere STAT_EXCHANGE _ID=inserted. EXCHANGE _ID if update (EXCHANGE_CODE)update STAT_EXCHANGE set EXCHANGE_CODE=inserted. EXCHANGE_CODEwhere STAT_EXCHANGE_ID=inserted. EXCHANGE _ID if update (EXCHANGE_NAME)update STAT_EXCHANGE set EXCHANGE_ NAME=inserted. EXCHANGE_ NAMEwhere STAT_EXCHANGE _ID=inserted. EXCHANGE _ID if update (EXCHANGE_NBR_ID)update STAT_EXCHANGE set EXCHANGE_ PARENT_ID=inserted. EXCHANGE_NBR_IDwhere STAT_EXCHANGE _ID=inserted. EXCHANGE _ID3) 禁止从表中与主表不匹配的外键值的插入if exists (select 1 from sysobjects where type=TR and name= TR_ARTICLE_INS) drop trigger TR_ARTICLE_INSgocreate trigger TR_ARTICLE_INSon ARTICLE for insertas declare rownum select rownum=rowcount if (select count(*) from AUTHS,insertedwhere AUTHS.AUTHOR_CODE=inserted.AUTHOR_CODE)!=rownum begin rollback tran print ARTICLE表中AUTHOR_CODE列的值在AUTHS表中不存在! end4) 数据的复制if exists (select 1 from sysobjects where type=TR and name= TR_EXCHANGE_INS) drop trigger TR_EXCHANGE_INSgocreate trigger TR_EXCHANGE_INSon EXCHANGE for insertasinsert into STAT_EXCHANGE(STAT_EXCHANGE_ID, EXCHANGE_CODE, EXCHANGE_NAME, EXCHANGE_PARENT_ID,AREA_ID, EXCHANGE _TYPE, BILLING_METHOD) select inserted. EXCHANGE_ID,inserted.EXCHANGE_CODE,inserted.EXCHANGE_NAME,inserted.EXCHANGE_NBR_ID,inserted.AREA_ID,EXCHANGE_TYPE,BILLING_METHOD from EXCHANGE_NBR where EXCHANGE_NBR_ID=inserted.EXCHANGE_NBR_ID48光标光标移植到Sybase的主要问题是:1) 如果光标是在服务器端使用的,比如一个存储过程中,要根据Sybase上使用服务器光标的语法对光标的处理进行改写即可。需要注意的是,在T-SQL中不支持光标循环,改写成相应的结构即
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 45801-2025企业标准自我声明公开数据同步要求
- GB/T 45722-2025半导体器件恒流电迁移试验
- 针灸推拿专业教学标准(高等职业教育专科)2025修订
- 中国彩涂板行业市场调研及未来发展趋势预测报告
- 2025年豪华电动车项目深度研究分析报告
- 亚麻粘弹力面料项目投资可行性研究分析报告(2024-2030版)
- 邮币卡培训课件
- 2025年医学检验个人述职报告
- 2025年 西式面点师(技师)理论考试练习题附答案
- 2022-2027年中国语音识别行业市场调研及投资规划建议报告
- (完整版)python学习课件
- 高钠血症护理查房
- 小学数学练习设计的有效性研究结题报告
- DL∕T 5776-2018 水平定向钻敷设电力管线技术规定
- 汕头市龙湖区2021年教师招聘《教育公共知识》试题及答案
- 浙江温州十校2023至2024学年高二下学期6月期末联考化学试题附参考答案(解析)
- 语文-山东省淄博市2023-2024学年高二下学期7月期末教学质量检测试题和答案
- 湖南省娄底市涟源市2023-2024学年六年级下学期6月期末英语试题
- 上海市徐汇区市级名校2025届物理高一第二学期期末考试模拟试题含解析
- 天一大联盟2024届高一数学第二学期期末统考试题含解析
- 【语文】西安外国语大学附属小学(雁塔区)小学五年级下册期末试卷(含答案)
评论
0/150
提交评论