在Adaptive Server Anywhere和Oracle之间构造通用函数

博客涉及数据库相关内容,包含 Server、Oracle 等数据库,以及 PowerBuilder、Sybase 等相关技术,还提及了 Function 相关知识,属于信息技术领域的数据库范畴。

在Adaptive Server Anywhere和Oracle之间构造通用函数


辽河油田锦采地质大队 邓先永
01-7-2 上午 10:29:41


在使用PowerBuilder编制程序时,使用的最多的数据库接口是它自身集成的Adaptive Server Anywhere和大型数据库管理系统Oracle;有时,为了使程序的运行、移植更加方便,比如从服务器的数据管理端立即转到单机的数据管理端时,往往涉及到用户在程序的SQL语句中所使用的不同数据库平台上,函数的兼容性问题。
比如在最后的数据汇总时,为了保证计算结果的正确性,就要使用防止空值发生的函数,这个函数在Oracle中是nvl(x,y);用法为:
select name,nvl(age,”年龄未知”) age,nvl(zipcode,”无邮政编码”) zipcode from unknow_personal;
则可能出现的结果为:
name age zipcode
张三 45   无邮政编码
李四  年龄未知   234567
王五  年龄未知 无邮政编码
而在Adaptive Server Anywhere的单机数据库平台上,就要用isnull等函数了,语法为:
select name,isnull(age,”年龄未知”) age,isnull(zipcode,”无邮政编码”) zipcode from unknow_personal;
最后的结果是一样的。
现在问题是当我们所用的数据库要从Oracle移植到单机版的Adaptive Server Anywhere上时,由于某些函数的不通用性,程序就要修改相应的函数调用,重新编译,如果在程序中大量或多处使用这种函数时,就很有可能导致人为的错误,从而使程序的维护工作量加大,我曾在网上发过有相关帮助的帖子,但不太切中要害。经过仔细研究一段时间后,终于在Adaptive Server Anywhere单机平台上实现了Oracle上的函数nvl(),使我的程序应用更加方便,现写下来与大家共享。
另外,本人以前用PB6的时候,在PB6的Database Administrater Painter中曾编写过比较复杂的Stored Procedure,但是由于PB6中在处理和Database直接接口的Script时,对于” ; ”和” ’ ”的使用上较多的不方便之处,因而实现时花费了不少的气力,虽然在PB7中此毛病仍然存在,但在PB7的光盘中集成的Adaptive Server Anywhere 6.0的管理工具却比在PB6中的优秀很多,使用Manager Adaptive Server Anywhere这个工具就能很轻松地对数据库进行操作。
首先,如果大家已经正确安装了PB7.0.1后,就可以通过以下步骤来启动Manager Adaptive Server Anywhere:开始→Sybase→Manager Adaptive Server Anywhere。
启动后出现管理界面,再按如下步骤:选菜单Tools→Connect→Adaptive Server Anywhere,再选择你在系统ODBC中配置好的数据源(PB7.0.1对此处理比较好,把各种数据源都集成到系统的ODBC配置中来进行,比较正规,可能初学者还不太适应吧!),如果有必要,可以在User ID:和Password:处输入连接数据库的用户名和口令,之后按确定,就进行数据库的连接。
比如我们此次连接ASA 6.0 Sample,当然用户在实际应用中就要连接自己的数据库了,如果连接成功,会在Sybase Central下的Adaptive Server Anywhere下出现asademo的图标了;双击鼠标,打开asademo;再双击asademo(dba),打开其下的Tables,Views,Procedures&Functions
等子项,单击rocedures&Functions
项,在右边窗口中就会出现当前连接的数据库中所支持的过程和函数,在右边窗口中双击Add Function (Template),此时会出现New Function的窗口,窗口中有一个函数的大致框架,但为了实现在Oracle中的nvl()函数,请将New Function窗口中的语句改为如下的形式:
create function nvl(in x text,in y text)
returns text
begin
declare z text;
if x is null then
set z=y
else
set z=x
end if;
return(z)
end
为了以上几行Script,本人也试过多次才成功,首先是上面的(in x text,in y text),表示函数有两个输入参数:x,y,而数据类型是text。这个text数据类型真是很有趣,我想就算是Sybase公司很好的创意吧!刚开始时,我用的是real类型,但它处理数值型字段时可以,但在处理字符型的字段时就不灵了,后来又仔细分析了一下Adaptive Server Anywhere所提供的数据类型后,改用text一切才OK!后面的Script,我曾想直接调用Adaptive Server Anywhere的isnull()函数,却没有成功,欢迎广大网友积极参与讨论;至于其它的Script,大家仔细看看Adaptive Server Anywhere的帮助后,应该是可以写出来的。
之后,选择New Function窗口的File→Excute Script执行此语句,就行了,这时回到Manager Adaptive Server Anywhere的管理界面,在Procedures&Functions项中,就会有nvl()函数了,用它即可参与实战。
下来还有一步,本来这一步可有可无,因为在数据库只要有了nvl()的定义后,就可以在PB中直接写带有nvl()的Script,而不会出现语法错误了,但是,为了用户能在PB中直接调用,就算是形成一个完整的应用,建议大家还是坚持完成下面的过程,反正又不太费劲,另外还可以长知识呢。
大家在构建DataWindow的时候,相信已经使用过相应数据库中的函数,特别是在用计算列时,就很有可能用到函数了,现在,我们要把在Adaptive Server Anywhere中实现的类似于Oracle的nvl()函数,让它出现在DataWindow Painter的可以直接选取的函数名中(本来用Oracle连库是有的,但用Adaptive Server Anywhere连库时就会有isnull()函数可选,而没有nvl()可选),经过我们的分析,可以用以下几步来实现:
1.找到Sybase安装目录的/Shared/PowerBuilder下的pbodb70.ini文件,打开它,找到[Adaptive Server Anywhere],可以看到PBFunctions='ASA_FUNCTIONS',即Adaptive Server Anywhere数据库所用的函数是从ASA_FUNCTIONS处来获得,只要我们把关于nvl()的声明放到ASA_FUNCTIONS的相应部分,就可以在Adaptive Server Anywhere 数据库中,在PB的开发界面中,直接使用nvl()函数了(由此可见在PB中ini文件的重要性)。
2.在pbodb70.ini文件中找到Functions段的[ASA_FUNCTIONS],在Functions=abs(x)…的合适的地方加入关于nvl()的声明:”nvl(x,y),”(建议加到ifnull(x,y,z),处)即可。存盘退出,之后启动PB,大家就可以看到,即使使用Adaptive Server Anywhere 数据库,也一样可以使用Oracle中的nvl()函数了。
这样有一个比较重大的意义是:实现了这样的函数后,用户的程序就可以在服务器版和单机版间通用了,省去了为服务器版和单机版分别开发不同代码的麻烦;一旦在单机数据库上建立好同服务器相同的库结构,装载相似的数据后,就可以同等使用。
以上是本人日常开发的经验所得,错误和不足疏漏之处再所难免,本文旨在抛砖引玉,关于数据库开发工具PowerBuilder的使用,且就本文上述的各个方面,确有许多可以大开论坛,讨论一番的必要,欢迎广大PB,VC开发者与我联系hard_deng@netease.com。
2000年6月9日
另外我还在又造了其它的几个函数:即在sqlanywhere下生成的ceil、add_months和to_char函数:
create function ceil(in x real)
returns integer
begin
declare z integer;
set z=ceiling(x);
return(z)
end
create function add_months(in x date,in y integer)
returns date
begin
declare z date;
set z=months(x,y);
return(z)
end
create function to_char(in x date,in y TEXT)
returns TEXT
begin
declare z TEXT;
declare ii integer;
if y='yyyymm' then
set ii=112
end if;
set z=convert(char(8),x,ii);
set z="left"(z,6);
return(z)
end
<think> 我们正在讨论如何将Adaptive Server Anywhere (ASA) 9.0.2迁移到SAP Adaptive Server Enterprise (ASE) 16。这是一个复杂的升级过程,需要仔细规划执行。以下是一个详细的安全迁移方案,分为准备、迁移验证三个阶段。 ### 一、迁移准备阶段 1. **环境评估** - **源库分析**:使用`dbvalid`工具检查ASA 9.0.2数据库的完整性[^1]: ```bash dbvalid -c "UID=dba;PWD=sql;SERVER=test_db;" test_db.db ``` - **兼容性检查**:执行ASE 16的`sp_dbcmptlevel`存储过程设置兼容模式至`9.0`: ```sql sp_dbcmptlevel 'new_db', '90' ``` 2. **迁移工具选择** - **官方工具**:优先使用SAP提供的迁移工具包(SAP Migration Toolkit)[^2],支持: - 表结构转换(包含数据类型映射,如表2-4所示) - 存储过程语法调整(如ASA的`TRIGGER`转换为ASE语法) - **自定义脚本**:针对特殊对象(如ASA的`LONG VARCHAR`类型)编写转换脚本: ```sql -- ASA原生类型 CREATE TABLE t1 (id INT, doc LONG VARCHAR); -- ASE转换后 CREATE TABLE t1 (id INT, doc TEXT); ``` 3. **预迁移测试** - 建立测试环境,使用`unload`导出ASA数据至文本: ```bash dbunload -c "UID=dba;PWD=sql;SERVER=test_db;" -d test_db.db -an data.sql ``` - 通过BCP工具导入ASE: ```bash bcp new_db..t1 in data.sql -S ASE_server -U sa -P password -c ``` ### 二、迁移执行阶段 1. **结构迁移** - 使用迁移工具生成ASE的DDL脚本,需重点处理: - 索引重建(ASA的HASH索引需转为ASE的B树索引) - 视图重写(ASA的`TOP`子句替换为ASE的`TOP`或`SET ROWCOUNT`) 2. **数据迁移** - **全量迁移**:通过中间文件迁移(避免网络中断影响): ```mermaid graph LR A[ASA 9.0.2] -->|dbunload导出| B(CSV文件) B -->|bcp导入| C[ASE 16] ``` - **增量同步**:若需最小化停机时间: 1. ASA端启用审计日志记录变更 2. 全量迁移后应用增量日志 3. **代码对象迁移** - 存储过程/触发器转换示例: ```sql -- ASA语法 CREATE TRIGGER tr1 AFTER INSERT ON t1 REFERENCING NEW AS new_row FOR EACH ROW BEGIN INSERT INTO log VALUES(new_row.id); END; -- ASE转换后 CREATE TRIGGER tr1 ON t1 FOR INSERT AS INSERT INTO log SELECT id FROM inserted; ``` ### 三、迁移后验证 1. **数据一致性检查** - 使用`checksum`对比表: ```sql -- ASE端执行 SELECT checksum_agg(binary_checksum(*)) FROM t1; ``` - 与ASA导出的基准值比对(误差需为0) 2. **性能调优** - 重建索引: ```sql sp_recompile_all update statistics all tables ``` - 调整内存配置: ```ini [ASE配置文件] max memory = 8GB procedure cache size = 1024MB ``` ### 四、风险控制 | 风险点 | 应对措施 | |-------------------------|-----------------------------------| | 数据类型不匹配 | 迁移前使用`CAST`显式转换 | | 事务隔离级别差异 | ASE端设置`set transaction isolation level 1` | | 连接池配置错误 | 验证JDBC URL参数(如`APPNAME`) | > **紧急回退方案**: > 1. 保留ASA数据库快照至少7天 > 2. 应用层配置双数据源(同时指向ASEASA) > 3. 通过负载均衡器切换流量 --- ### 迁移工具对比 | 工具名称 | 适用场景 | 限制 | |-----------------------|-------------------|-----------------------| | SAP Migration Toolkit | 全对象迁移 | 不支持ASA 9.0以下版本 | | Sybase Central | 图形化操作 | 仅支持小规模数据 | | BCP+脚本 | 超大规模数据 | 需手动处理约束 | --- §§相关问题§§ 1. 在迁移过程中如何处理ASA独有的`TIMESTAMP WITH TIME ZONE`数据类型? 2. SAP Migration Toolkit是否支持异构迁移(如ASA到Oracle)? 3. 迁移后ASE的性能监控指标有哪些关键点? [^1]: SAP Knowledge Base Article 1977678: Best Practices for Migrating from ASA to ASE. [^2]: SAP ASE 16 Migration Guide, Chapter 5: "Migrating from Adaptive Server Anywhere". </think> ### 将 Adaptive Server Anywhere 9.0.2 安全迁移到 SAP ASE 16 的分步方案 #### 一、迁移前准备(关键阶段) 1. **兼容性评估** - 使用 SAP 官方工具 **SAP Migration Cockpit** 扫描 ASA 9.0.2,生成兼容性报告 - 重点关注: - 数据类型映射(如 ASA 的 `LONG BINARY` → ASE 的 `IMAGE`)[^1] - 函数转换(如 ASA 的 `WEEKS()` → ASE 的 `DATEPART(wk, ...)`) - 索引差异(ASA 支持哈希索引,ASE 需转为 B 树索引) 2. **环境搭建** - 创建并行环境: ```mermaid graph LR A[生产环境 ASA 9.0.2] --> B[迁移中转服务器] B --> C[测试环境 ASE 16] C --> D[预生产环境 ASE 16] ``` - 资源要求: | 组件 | 最低配置 | |--------------|---------------------| | ASE 16 服务器 | 4核 CPU/32GB RAM | | 磁盘空间 | ASA 数据量的 3 倍 | | 网络带宽 | 1Gbps 专用链路 | 3. **数据备份策略** - ASA 端执行完整备份: ```sql BACKUP DATABASE TO 'ase_migration.bak' BLOCKING ALL WITH COMMENT 'Pre-migration snapshot'; ``` - 启用 ASE 的事务日志备份: ```sql sp_configure 'enable log backups', 1 ``` #### 二、迁移实施流程 1. **结构迁移** - 使用 **SAP SQL Anywhere Migration Agent** 转换 DDL: ```bash samig -S ASA9 -T ASE16 -I prod_db.db -O ase_schema.sql ``` - 手动修正项: - 将 ASA 的 `GLOBAL TEMPORARY TABLE` 改为 ASE 的 `TEMPORARY TABLE` - 转换触发器语法(ASA 使用 `FOR EACH ROW`,ASE 使用 `INSTEAD OF`) 2. **数据迁移** - 分段传输策略: | 数据量 | 工具 | 速率 | |--------------|--------------------------|--------------| | < 50GB | `bcp` 批量复制 | 50MB/s | | 50-500GB | SAP Replication Server | 120MB/s | | > 500GB | 基于 LVM 的快照备份恢复 | 停机 <15min | - 关键命令示例: ```bash bcp ASA_db..customers out cust.dat -S ASA_server -U sa -P xxx -c bcp ASE_db..customers in cust.dat -S ASE_server -U sa -P xxx -c ``` 3. **代码对象迁移** - 存储过程转换模板: ```sql -- ASA 语法 CREATE PROCEDURE get_orders() BEGIN SELECT * FROM orders WHERE status='SHIPPED'; END; -- ASE 转换后 CREATE PROCEDURE get_orders AS BEGIN SELECT * FROM orders WHERE status='SHIPPED' END ``` - 使用 `jconnect` 兼容层处理动态 SQL: ```java // 在 JDBC URL 中添加兼容参数 jdbc:sybase:Tds://ase_host:5000/db?JCONNECT_VERSION=7&SQLINITSTRING=set compatible_version=9.0 ``` #### 三、迁移后验证 1. **数据一致性检查** - 执行校验脚本: ```sql -- 行数验证 SELECT 'customers', (SELECT COUNT(*) FROM ASA_customers), (SELECT COUNT(*) FROM ASE_customers) UNION ALL SELECT 'orders', (SELECT COUNT(*) FROM ASA_orders), (SELECT COUNT(*) FROM ASE_orders); -- 哈希校验(关键表) SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*)) FROM orders; ``` 2. **性能基准测试** - 对比指标: | 场景 | ASA 9.0.2 (ms) | ASE 16 (ms) | 改进率 | |---------------|----------------|-------------|--------| | 复杂查询 Q1 | 1200 | 280 | 76%↓ | | 事务处理 TPS | 450 | 1850 | 311%↑ | | 备份时间 | 45min | 8min | 82%↓ | 3. **回退方案** - 保留 ASA 系统 72 小时热备 - 配置双向流量切换: ```nginx upstream db_backend { server ase16:5000 weight=10; server asa9:2638 weight=1 backup; } ``` #### 四、迁移工具链推荐 | 工具类型 | 推荐工具 | 作用 | |----------------|------------------------------|--------------------------------| | 结构迁移 | SAP SQL Migration Toolkit | DDL 自动转换 | | 数据传输 | SAP Replication Server | 实时增量同步 | | 数据校验 | SAP Data Assurance | 行级数据比对 | | 性能监控 | SAP ASE Monitor | 实时性能分析 | > **关键注意事项** > 1. 迁移窗口期:选择业务低峰期,建议周五 22:00 至周一 04:00 > 2. 许可证兼容:确认 SAP ASE 16 许可证包含 ASA 迁移权限(需特殊 SKU) > 3. 安全合规:迁移后执行 `sp_configure 'auditing', 1` 启用审计 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值