自学编程难不难系列 之 DB2 ..

作者: 一了 <1liao3@funlang.org>
日期: 2017-12-31

2003 年做审计署人力资源管理系统的时候, 甲方审计署指定要用 Delphi 来写程序, 数据库指定用 IBM DB2. 当时全公司都没有一丁点的 DB2 经验, 这个任务又落到我的身上了.

DB2 实际上相当难用, 部署完以后我立刻就写了一个轻量级的 SQL 查询工具. 因为之前的 GMIS 即人力资源管理系统是用 .NET 写的, 数据库是 MS SQL Server, 程序中用到了大量的 SQL Server 数据库函数, 为保证之前的代码(主要是 SQL 和 存储过程)兼容, 我将当时所有的 SQL Server 函数在 DB2 中重新实现了一遍, 并且将存储过程也移植到 DB2. 然后就忘了啥是 DB2 了, 哈哈..

因为涉及到多方信息保护问题, 实现和移植代码不能在这里贴出来, 作为补偿, 我可以贴一点部署代码. 当时有差不多 100 个重实现及移植文件, 之间又有蛮强的依赖关系, 部署起来实际上也不容易, 为此我还写了好几个批处理文件, 算是我写过最复杂的批处理了. 如果放现在, 我一定用 fun 语言来写, 批处理写起来太蛋疼了...

部署说明文件:


	Db2 存储过程/用户函数自动部署工具


1 请预先维护 ConnectTo.txt, DeployList.txt

2 DeployList.txt 格式如下: (需要按照依赖关系从上到下排列)

	Function		FunctionFileName
	Procedure		ProcedureFileName
	Specific Function	FunctionSpecificFileName
	...			...

3 在 .\SQL\ 目录上放置 DeployList.txt 所列的所有文件(需要文件名和过程/函数名一致)

4 确保 Db2 服务器上有 C 语言编译器, 并将其编译路径设置正确

5 执行 DeployAll.bat, 即可(执行结果保存在 Report.txt 文件)


-- End Of ReadMe File --


其中一个批处理文件: MakeDeploy.bat


@rem	请预先维护 ConnectTo.txt, DeployList.txt


@echo.				>	Deploy.txt


@FOR /F "usebackq delims=." %%i IN (`type DeployList.txt`) DO Call MakeUnDeployOne.bat @ %%i


@type	Deploy.txt		>	tempDeploy.txt

@echo.				>	Deploy.txt
@Call MakeDeployOne.bat	@	0	ConnectTo.txt

@type	tempDeploy.txt		>>	Deploy.txt

@del	tempDeploy.txt


@FOR /F "usebackq delims=" %%i IN (`type DeployList.txt`) DO Call MakeDeployOne.bat @ %%i


写这篇文章的目的不是为了炫耀我懂 DB2, 实际上我完全不懂 DB2, 完全不想再搞一次, 真是难用到极点了. 写这个的目的是想说明做事情有很多方法, 我个人最喜欢的就是采用兼容的办法, 花最小的代价, 保证最大的兼容. 我重写了这么多函数, 移植了这么多存储过程, 看起来是很麻烦, 但是相比在这么大的一个项目里到处找 SQL 语句去改, 代价还是蛮小的.

想起来之前在财政部下面一个公司工作的时候, 也碰到过类似的问题. 有一天, 部门经理在吃饭的时候聊到 PB 升级的一些烦恼, 其中有一个就是字符串长度函数因为从 ANSI 变为 Unicode 导致返回结果跟之前不一致, 要改非常多地方. 我实际上当时对 PB 也不是很熟, 就问他 PB 支不支持函数重载(覆盖重载), 他说不清楚, 我就说那就试一试, 将这个函数用同名函数覆盖重写一下, 改成 PB 老版本的逻辑. 结果第二天中午吃饭的时候, 就高兴的告诉我问题就这样解决了.

简单的就是最好的, 通常兼容是保证升级或者优化重构甚至重写顺利进行的最简单的方法, 只有在迫不得已的情况下, 我才会放弃兼容.