引言 IBM® DB2® Universal Database™ Linux、UNIX® 和 Windows® 版(下称 DB2 UDB)提供了两种从命令行界面输入命令的方式。当以交互(Interactive)模式使用 DB2 UDB 命令行处理器(DB2 UDB Command Line Processor,DB2 UDB CLP)时,您不必在 DB2 UDB 命令或 SQL 查询前加上要害字 db2 。假如您不熟悉 DB2 UDB CLP 不同的运行模式,那么请查看 DB2 规划 - DB2 V8.1 Family Fundamentals 认证预备教程,第 1 部分(共 6 部分)。 请看一下 图 1,图中在运行于交互模式下的 DB2 UDB CLP 中输入了 SELECT *... 语句。您知道这个特定表(STAFF)位于哪个数据库或实例吗?您大概不知道吧(虽然对于这个特例,您可以猜测);可是,DB2 UDB 知道! 图 1. 缺省的 CLP 视图不会告诉您连接到了哪个实例

现在看一眼下面 图 2中一模一样的查询。您现在能回答我的问题了吗?注重到有什么不同了吗? 图 2. 对 CLP 进行了定制,以向您显示您所连接的实例和数据库

带修订包 1(Fix Pack 1,FP1)的 DB2 UDB V8.1 提供了很棒的新功能,这项功能可以让您在运行于交互模式时,定制 DB2 UDB CLP 提示符(后文所指的 DB2 UDB CLP 就是运行于交互模式的 DB2 UDB CLP)。 您可以使用这项新的定制功能,把您自己的文本和反映当前实例连接(instance attachment)和/或数据库连接(database connection)的上下文(context)的变量添加到输出显示。本文将向您介绍这项新的定制功能。 定制交互模式下的 DB2 UDB CLP 带 FP1 的 DB2 V8.1 新增了可定制的 DB2 UDB CLP 交互提示符功能。现在 DB2 UDB CLP 提示符可以反映当前实例连接和数据库连接的上下文,还可以显示特定的字符消息。假如没有该项功能,使用交互模式下的 DB2 CLP 会显示硬编码的提示符,如 图 3所示。 图 3. CLP 中的硬编码提示符

在继续下去之前:关于 DB2 UDB 注册表变量的 20 秒课程 您可以使用 DB2 UDB 注册表变量更改环境。这些变量之所以可以被这样设置,是因为它们本质上是动态的,并且可适用于当前运行时环境,而无需包含在系统启动概要文件中。有一些 DB2 UDB 注册表变量只能设置为系统启动的一部分。 DB2 UDB V8.1 提供了 DB2 概要注册表(DB2 Profile Registry)用以控制环境。在以前的发行版中,假如更改了环境级别,就需要重新引导 DB2 UDB。现在有了一些例外,可以通过存储在 DB2 概要注册表中的注册表变量对 DB2 UDB V8.1 环境进行专门控制。 可使用 db2set命令更新 DB2 UDB 注册表变量;这些信息被立即存储到概要注册表中。DB2 概要注册表将这些更新过的信息应用到在进行更改之后启动的 DB2 UDB 服务器实例和应用程序。 也可以使用 set命令给环境级变量赋值,以用于临时会话(以此方式设置的大部分变量会出现在 DB2 UDB 注册表中;但是,有一些不会,如 DB2INSTANCE)。 假如需要永久性设置某个环境变量,那么您应该使用 db2set命令在工作站的启动概要文件内设置它。 set命令设置的环境变量只在命令行会话期间有效,而 db2set命令行则将环境变量永久性地设置在 DB2 概要注册表中。 要查看全部受支持的注册表变量列表,请输入以下命令: db2set -lr 要更改 DB2 UDB 注册表变量的值,请输入以下命令: db2set registry_variable_name=new_value 要查看被设置的全部 DB2 UDB 注册表变量列表,请输入以下命令: db2set -all 此命令的输出类似图 4。 图 4. db2 set -all 命令的输出

请注重环境级变量前面有个 [e] ,而实例变量和全局变量前面分别为 [i] 和 [g] 。 设置 DB2_CLPPROMPT 注册表变量 要定制 DB2 UDB CLP 命令提示符,请使用新的 DB2 UDB 注册表变量:DB2_CLPPROMPT。 您可以将 DB2_CLPPROMPT 设置为长度不超过 100 个字符的任何文本字符串。这个定制的字符串可包含在运行时可替换的可选标记。假如这个注册表变量在 DB2 UDB CLP 会话期间发生更改,那么新的值在用户退出再重新进入该处理器后方可生效。 可以将 DB2 UDB CLP 定制为只显示一行字符串,这是最基本的形式。 图 5和 图 6演示了 DB2_CLPPROMPT 注册表变量的设置以及 DB2 UDB CLP 的后续调用。 图 5. 设置命令行提示符注册表变量

图 6. 结果

现在,尽管这个示例挺有意思,但没什么大用。DB2_CLPPROMPT 注册表变量可以附带一些关联变量,可以用这些变量向 DB2 UDB CLP 返回一些关于当前的或缺省的实例连接以及当前所连接的(或缺省的)数据库的信息。 受支持的变量如 表 1所示。 表 1.受 CLP 支持的运行时变量
变量 |
运行时值 |
%ia |
假如存在实例连接,则为当前实例连接的授权标识(authid);否则为空字符串。 |
%i |
假如实例连接存在,则为当前所连接的实例的本地别名;假如不存在本地实例连接,则为 DB2INSTANCE 或 DB2INSTDEF 注册表变量的值;否则,为空字符串。 |
%da |
假如存在数据库连接,则为当前数据库连接的授权标识;否则为空字符串。 |
%d |
假如数据库连接存在,则为当前连接的数据库的本地别名;否则为 DB2DBDFT 注册表变量值;再不然则为空值。 |
%n |
换行符。 |
例如,要设置 DB2 UDB CLP 提示符,使其解析为: (Instance , Database ): 输入以下命令: db2set db2_clpprompt=" (Instance:%I, Database: %d):" 您可以输入 db2set all 命令来验证 DB2 UDB 概要注册表中的该项设置。 图 7向您显示了这一命令序列,包括在以交互模式启动 CLP 会话之后的显示结果。 图 7. 设置 DB2_CLPPROMPT 并验证其使用

请注重此例中,我用了 未处于交互模式的 DB2 UDB CLP,这就是为什么交互模式在同一个窗口中被启动的原因(我这样做是让您体会一下调用 DB2 UDB CLP 的不同方式)。 图 7 中,您会看到 变量没有值。该变量之所以为空是因为在我的环境中没有数据库连接或者定义的缺省数据库。 假如您连接到数据库,这个变量就会更新,如 图 8所示。 图 8. 出现在提示符上的实例名和数据库名

假如我从这个数据库断开,这个定制的字符串会反映出这一操作。假如我接着再连接到不同的实例,在 DB2 UDB CLP 中也会得到动态的反映,如 图 9所示。 图 9. 连接到新的 DB2 UDB 实例时,CLP 动态进行更新

DB2_CLPPROMPT 脑力测试 对于 DB2_CLPPROMPT 变量,有很多组合变量的方法。我把它留给您去试验,您不仅可以试验不同的可用变量,还可以看看它们对于不同环境设置的相应结果。 不过来一点“离别测试怎么样? 根据以下设置: db2set db2_clpprompt="db2 (%ia@%i, %da@%d):" 以下条件下,您会看到什么结果? DB2INSTANCE 设为 TESTING。DB2DBFT 未设置。不存在已连接的实例连接,也不存在数据库连接。单击此处,获得 答案。 DB2INSTANCE 设为 DB2。DB2DBFT 设为 SAMPLE。DB2 实例有一个实例连接,授权标识为 PAULZ。 单击此处,获得 答案。 DB2INSTANCE 设为 DB2。DB2DBFT 设为 SAMPLE。只有一个数据库连接到 SAMPLE 数据库,授权标识为 PAULZ。单击此处,获得 答案。 关于作者

Paul C. Zikopoulos,文学士,MBA,是一位与 IBM Global Sales Support 小组合作的 IDUG 的专题和获奖发言人。他有七年多的 DB2 使用经验,还写了许多关于 DB2 的杂志文章和书籍。Paul 为很多杂志撰写有关 DB2 的文章,并且是多本书的合作者,包括: DB2 - The Complete Reference、DB2 Fundamentals Certification for Dummies、DB2 For Dummies以及 A DBA's Guide to Databases on Linux。Paul 是一位 DB2 认证高级技术专家(DB2 Certified Advanced Technical Expert)(DRDA 和 Cluster/EEE)、DB2 认证解决方案专家(DB2 Certified Solutions Expert)(商业智能(Business Intelligence)和数据库治理(Database Administration))。您可以通过 paulz_ibm@msn.com 与他联系。