WEB开发网
开发学院数据库DB2 DB2数据库移植常见问题全面解析 阅读

DB2数据库移植常见问题全面解析

 2009-01-19 16:39:38 来源:WEB开发网   
核心提示: 将上述代码保存在一个文本文件中,假设保存到 func.db2 中,DB2数据库移植常见问题全面解析(9),使用以下命令创建函数:db2 –td@ -f func.db2,然后即可使用该 UDF 进行时间格式转换,以便在其它机器上部署解决办法:在开发中心中可以导出存储过程为脚本,

将上述代码保存在一个文本文件中,假设保存到 func.db2 中,使用以下命令创建函数:db2 –td@ -f func.db2。然后即可使用该 UDF 进行时间格式转换。该函数可以根据输入的 timestamp 转换为多种格式,包括 yyyymmdd,mm/dd/yyyy,yyyy/dd/mm hh:mi:ss,或者返回毫秒数(nnnnnn)。

在 SQL 存储过程中有('每月'||COALESCE(VAR, '')||'元')语句时,编译无法通过

解决办法:客户端 codepage 和脚本的编码格式不同,所以服务器端无法识别脚本命令,把客户端 codepage 设为 1386 即可。

Oracle 中有一个函数 DBMS_SQL.VARCHAR2_TABLE,可以传入一个以某个分隔符为分隔的字符串,该函数将该字符串以分隔符拆分,返回给调用者一个数组或是表,DB2 中如何实现类似功能?

解决办法:用全局临时表实现;

原因分析:Oracle 中的 varchar2_table 其实是集合的概念,在 DB2 中不支持集合。DB2 通常做法是声明全局临时表(DGTT),第一列存储记录顺序,第二列存储数据。以下是示例,在声明后即可向该表中插入和查询数据,效果和集合相同。

清单 11. 实现拆分

DECLARE GLOBAL TEMPORARY TABLE SESSION.temp_emp_list

(num integer, EmpName varchar(30))

WITH REPLACE

ON COMMIT PRESERVE ROWS NOT LOGGED;

DB2 无法对允许空值的列建唯一性索引

解决办法:将该列属性设为不允许为空;

原因分析:空值在数据库中被认为是不确定值,任何其他值与空值组合,结果仍然是空值,不具备唯一性,所以 DB2 不允许空值列作为唯一键的索引列。

同一张表的索引可以放在不同表空间中吗?

解决办法:在创建表的时候使用 INDEX in tablespace-name 选项,在该表上创建的索引将存放在指定的表空间上;

原因分析:表数据,表索引,以及表中的 long 型数据可以分开存放在不同的表空间。可以提高性能。

用UDF 调用存储过程总是编译通不过,报关键字冲突错误

解决办法:把该 UDF 改造成存储过程;

原因分析:DB2 中 UDF 主要用于逻辑运算和处理,存储过程则偏重于处理数据库对象,如表数据的增删查改,所以两者的用途不同决定了其使用方式也不同,UDF 使用的是内嵌的 SQL 语句,是 SQL 语言的子集,不能执行动态 SQL,如果 UDF 调用存储过程,则会导致 SQL 嵌套上的混乱,因为 UDF 通过调用存储过程实现了 SQL 全集,这是不允许的,所以报关键字冲突,把该 UDF 改为存储过程即可。

建议对于不涉及数据库表操作的业务逻辑可以用 UDF 实现,如逻辑算法,文件操作,系统调用等,而涉及到数据库表操作的功能则交给存储过程来实现。存储过程可以调用 UDF。

工具使用

如何在 CLP 中查看表结构

解决办法:使用 db2 describe table 命令。

用开发中心远程调试存储过程,可以构建,但构建并调试却不能成功

解决办法:在远程数据库上安装 DB2 开发包;

原因分析:在远程调试时将会调用远程数据库上的开发包,所以远程服务器一定要装有开发包才可远程调试。

如何将部署在 DB2 数据库上的存储过程导出为可执行脚本,以便在其它机器上部署

解决办法:在开发中心中可以导出存储过程为脚本,前提是之前创建存储过程的时候没有指定 hide body。

如何让 DB2 自动运行 runstat

解决办法:使用 db2 update db cfg using auto_runstats on 命令。

上一页  4 5 6 7 8 9 

Tags:DB 数据库 移植

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接