命令行处理器功能
此部分提供有关命令行处理器功能部件的信息。
- 在命令提示符处输入 CLP 命令 (在任何一种情况下)。
- 通过按 ENTER 键将命令发送到命令 shell。
- 输出自动定向到标准输出设备。
- 支持管道和重定向。
- 用户将收到成功和不成功完成的通知。
- 执行该命令后,控制返回到操作系统命令提示符,用户可以输入更多命令。
- 当使用文件输入选项调用 CLP 时,它将自动将 CLIENT APPLNAME 专用寄存器设置为
CLP filename。
- 输入 db2 命令,或者,
- 在 Linux® 操作系统上,单击 主菜单 ,然后选择 。
- 发出 SQL 语句:
db2 connect to database - 与注册表变量 所定义的默认数据库建立隐式连接。 Db2® 注册表变量 DB2DBDFT 所定义的默认数据库建立隐式连接。
如果命令超出命令提示符处允许的字符限制,那么可以使用反斜杠 (\) 作为行连续字符。 当 命令行处理器 迂到行连续字符时,它将读取下一行并并置这两行中包含的字符。 或者,可以使用 -t 选项来设置不同的行终止字符。
NULL 的字符串识别为空字符串。 以后可以将先前设置为某个值的字段设置为 NULL。 例如, db2 update database manager configuration using tm_database NULL将 tm_database 字段设置为 NULL。 此操作区分大小写。 小写 null 不会解释为空字符串,而是解释为包含字母 null的字符串。定制命令行处理器
可以使用 DB2_CLPPROMPT 注册表变量来定制交互式输入提示。 此注册表变量可以设置为最大长度为 100 的任何文本字符串,并且可以包含标记 %i, %ia , %d, %da 和 %n。 将在运行时替换这些令牌的特定值。
| DB2_CLPPROMPT token | 运行时的值 |
|---|---|
| %ia | 当前实例连接的授权标识 |
| %i | 当前连接的实例的本地别名。 如果不存在实例连接,那么为 DB2INSTANCE 注册表变量的值。 仅在 Windows 平台上,如果未设置 DB2INSTANCE 注册表变量,那么为 DB2INSTDEF 注册表变量的值。 |
| %da | 当前数据库连接的授权标识 |
| %d | 当前连接的数据库的本地别名。 如果不存在数据库连接,那么为 DB2DBDFT 注册表变量的值。 |
| %n | 换行符 |
- 如果任何令牌在运行时没有关联值,那么会将空字符串替换为该令牌。
- 交互式输入提示将始终以大写形式显示授权标识,数据库名称和实例名称,以便与提示中显示的连接和附件信息保持一致。
- 如果在 CLP 交互方式下更改了 DB2_CLPPROMPT 注册表变量,那么直到关闭并重新打开 CLP 交互方式之后, DB2_CLPPROMPT 的新值才会生效。
您可以使用 DB2_CLPHISTSIZE 注册表变量来指定要存储在命令历史记录中的命令数。 HISTORY 命令允许您访问在 CLP 交互方式会话中运行的命令历史记录的内容。
您还可以指定在使用 DB2_CLP_EDITOR 注册表变量发出 EDIT 命令时打开的编辑器。 从 CLP 交互式会话中, EDIT 命令打开预先装入了用户指定的命令的编辑器,然后可以编辑并运行该命令。
示例
如果 DB2_CLPPROMPT 定义为 (%ia @%i, %da @%d),那么输入提示将具有以下值:
- 没有实例连接,也没有数据库连接。 DB2INSTANCE 设置为 DB2。 未设置 DB2DBDFT 。
(@DB2, @) - (Windows) 没有实例连接,也没有数据库连接。 未设置 DB2INSTANCE 和 DB2DBDFT 。 DB2INSTDEF 设置为 DB2。
(@DB2, @) - 没有实例连接,也没有数据库连接。 DB2INSTANCE 设置为 DB2。 DB2DBDFT 设置为 "SAMPLE"。
(@DB2, @SAMPLE) - 实例连接到授权标识为 "keon14" 的实例 "Db2"。 DB2INSTANCE 设置为 DB2。 DB2DBDFT 设置为 "SAMPLE"。
(KEON14@DB2, @SAMPLE) - 与授权标识为 "horton7" 的数据库 "sample" 的数据库连接。 DB2INSTANCE 设置为 DB2。 DB2DBDFT 设置为 SAMPLE。
(@DB2, HORTON7@SAMPLE) - 实例连接到授权标识为 "keon14" 的实例 "Db2"。 与授权标识为 "horton7" 的数据库 "sample" 的数据库连接。 DB2INSTANCE 设置为 DB2。 DB2DBDFT 未设置。
(KEON14@DB2, HORTON7@SAMPLE)
在命令文件中使用命令行处理器
db2 "create table mytable (name VARCHAR(20), color CHAR(10))"有关命令和命令文件的更多信息,请参阅相应的操作系统手册。
命令行处理器设计
命令行处理器 由两个进程组成: 充当用户界面的前端进程 ( Db2 命令) 和维护数据库连接的后端进程 (db2bp)。
- 维护数据库连接
每次调用 db2 时,都会启动新的前端进程。 后端进程由第一个 db2 调用启动,并且可以使用 TERMINATE显式终止。 具有相同父代的所有前端进程都由单个后端进程提供服务,因此共享单个数据库连接。
例如,来自同一操作系统命令提示符的以下 db2 调用会导致单独的前端进程共享单个后端进程,这将在整个过程中保存数据库连接:db2 'connect to sample',db2 'select * from org',. test01(其中 test01 是包含 Db2 命令的 shell 脚本) ,以及db2 -tf myfile.clp
来自同一操作系统提示的以下调用会导致单独的数据库连接,因为每个调用都有一个不同的父进程,因此还有一个不同的后端进程:test01. test01 &test01 &sh test01
- 前端和后端进程之间的通信
前端进程和后端进程通过三个消息队列进行通信: 请求队列,输入队列和输出队列。
- 环境变量
以下环境变量提供了配置两个进程之间的通信的方法:
表 2. 环境变量 变量 最小值 最大值 缺省值 DB2BQTIME 1 秒 5294967295 1 秒 DB2BQTRY 0 次尝试 5294967295 60 次尝试 DB2RQTIME 1 秒 5294967295 5 秒 DB2IQTIME 1 秒 5294967295 5 秒 - DB2BQTIME
- 调用 命令行处理器 时,前端进程将检查后端进程是否已处于活动状态。 如果它处于活动状态,那么前端进程将重新建立与它的连接。 如果它未处于活动状态,那么前端进程会将其激活。 然后,前端进程将标识 DB2BQTIME 变量指定的持续时间,然后再次检查。 前端进程将继续检查 DB2BQTRY 变量指定的次数,在此之后,如果后端进程仍未处于活动状态,那么它将超时并返回错误消息。
- DB2BQTRY
- 与 DB2BQTIME 变量结合使用,并指定前端进程尝试确定后端进程是否处于活动状态的次数。
可以在峰值时段内增大 DB2BQTIME 和 DB2BQTRY 的值,以优化查询时间。
- DB2RQTIME
- 一旦启动后端进程,它就会在其请求队列中等待来自前端的请求。 它还在从命令提示符启动的请求之间的请求队列上等待。
DB2RQTIME 变量指定后端进程等待来自前端进程的请求的时间长度。 在此时间结束时,如果请求队列上不存在任何请求,那么后端进程将检查前端进程的父进程是否仍然存在,如果不存在,那么将自身终止。 否则,它将继续在请求队列上等待。
- DB2IQTIME
- 当后端进程接收到来自前端进程的请求时,它会向前端进程发送应答,指示它已准备好通过输入队列接收输入。 然后,后端进程在其输入队列上等待。 在执行批处理文件 (使用 -f 选项指定) 时以及用户处于交互方式时,它也会在输入队列上等待。
DB2IQTIME 变量指定后端进程在输入队列上等待前端进程传递命令的时间长度。 经过此时间后,后端进程将检查前端进程是否处于活动状态,并在前端进程不再存在时返回到请求队列上等待。 否则,后端进程将继续等待来自前端进程的输入。
要查看这些环境变量的值,请使用 LIST COMMAND OPTIONS。
后端环境变量继承在启动后端进程时由前端进程设置的值。 但是,如果更改了前端环境变量,那么后端进程将不会继承这些更改。 必须首先终止后端进程,然后重新启动 (通过发出 db2 命令) 以继承已更改的值。
以下场景提供了必须终止后端进程的示例:
- 用户 A 登录,发出一些 CLP 命令,然后注销而不发出 TERMINATE。
- 用户 B 使用同一窗口登录。
- 当用户 B 发出某些 CLP 命令时,它们将失败,并返回消息 DB21016 (系统错误)。
当用户 B 开始使用 CLP 时,用户 A 启动的后端进程仍处于活动状态,因为用户 B 的前端进程 (从中发出命令的操作系统窗口) 的父进程仍处于活动状态。 后端进程尝试为用户 B 发出的新命令提供服务; 但是,用户 B 的前端进程没有足够的权限来使用后端进程的消息队列,因为它需要创建该后端进程的用户 A 的权限。 在用户使用同一操作系统窗口启动新的 CLP 会话之前, CLP 会话必须以 TERMINATE 命令结束。 这将为每个新用户创建一个新的后端进程,以防止权限问题,并在新用户的后端进程中设置环境变量 (例如 DB2INSTANCE) 的正确值。
CLP 使用说明
可以从命令提示符输入大写或小写的命令。 但是,必须输入对 Db2 区分大小写的参数,以准确的大小写要求。 例如, CHANGE DATABASE COMMENT 命令的 WITH 子句中的 comment-string 是区分大小写的参数。
SQL 语句中允许使用定界标识。
特殊字符或元字符(如 $ & * ( ); < >?\ ' " )允许在 CLP 命令中使用。 如果在 CLP 交互方式或 CLP 批处理输入方式之外使用这些字符,那么操作系统 shell 将解释这些字符。 如果 shell 不执行任何特殊操作,那么需要引号或转义字符。
db2 select * from org where division > 'Eastern'被解释为 "select <the names of all files> from org where division"。 结果 (SQL 语法错误) 将重定向到文件 Eastern。 以下语法生成正确的输出: db2 "select * from org where division > 'Eastern'"特殊字符因平台而异。 在 AIX Korn shell 程序中,可以使用转义字符 (\) (例如 \ * , \> 或 \ ') 来重写先前的示例。
db2 "select * from staff" > mydata/staflist.txt db2 -r mydata\staflist.txt "select * from staff"
db2 -z mydata\staflist.txt "select * from staff" db2 connect to :HostVar in share mode语法不正确,因为 :HostVar 不是有效的数据库名称。命令行处理器 将 SQL NULL 值表示为连字符 (-)。 如果该列是数字,那么会将连字符放在该列的右侧。 如果列不是数字,那么连字符位于左侧。
要从 Db2 命令行处理器 窗口正确显示单字节 (SBCS) 语言的本地字符,必须选择 True Type 字体。 例如,在 Windows 环境中,打开命令窗口属性笔记本并选择诸如 Lucinda 控制台之类的字体。 将打印不可打印的字符 (例如,钟 (0x7)) 而不进行替换,因此必须特别考虑 ASCII 空字符 (0x0)。 尽管可以接受在 VARCHAR 字符串中使用 ASCII 空字符 (0x0) ,但字符串的显示在字符串中找到的第一个 ASCII 空字符处结束。
db2 "insert into sample values (x'410041')"
db2 "insert into sample values (x'410741')"
db2 "select CHARACTER_LENGTH(DATA, OCTETS) LENGTH,
DATA,
hex(DATA) HEX_VALUE
from sample"
LENGTH DATA HEX_VALUE
----------- -------------------- ----------------------------------------
3 A 410041
3 AA 410741命令行处理器不支持文件路径名中的本地语言支持 (NLS) 字符。 这尤其影响诸如 IMPORT, EXPORT和 REGISTER XMLSCHEMA之类的命令,在这些命令中,最常迂到有问题的文件路径名。
支持将命令行处理器命令的输出通过管道传送到另一个命令行处理器命令。 例如: db2 -x <SQL_statement> | db2 +p -tv。 此支持仅受管道缓冲区大小限制。 管道缓冲区大小不可配置。 如果第一个命令超出管道缓冲区大小,那么当尝试将输出写入管道缓冲区时,命令行处理器可能会挂起或失败。 如果第二个命令不是命令行处理器命令 (例如 UNIX shell 命令) ,那么由于管道缓冲区大小限制,将不会发生挂起或失败。
命令行处理器 支持数据库连接的 db2dsdriver.cfg 配置文件。 您可以将嵌入式 SQL 支持的 db2dsdriver.cfg 关键字与 命令行处理器配合使用。
缺省情况下, CLP 应从命令中除去除 CREATE PROCEDURE/FUNCTION/TRIGGER/METHOD 命令以外的所有换行字符。 对于这些命令, CLP 将保留原始命令中的所有换行符。