WEB开发网
开发学院数据库DB2 DB2 基础: DB2 UDB 命令行处理器入门 阅读

DB2 基础: DB2 UDB 命令行处理器入门

 2010-07-20 00:00:00 来源:WEB开发网   
核心提示:DB2 UDB 命令行处理器(CLP)是一个接口,通过这个接口可以方便地访问 DB2 UDB 函数,DB2 基础: DB2 UDB 命令行处理器入门,CLP 接受来自 DB2 命令行的命令或 SQL 语句,在基于 Linux 和 UNIX® 的系统中,我希望您进一步进行研究,开发自己的脚本,这个命令行是 DB2

DB2 UDB 命令行处理器(CLP)是一个接口,通过这个接口可以方便地访问 DB2 UDB 函数。CLP 接受来自 DB2 命令行的命令或 SQL 语句。在基于 Linux 和 UNIX® 的系统中,这个命令行是 DB2 实例的命令行。在 Windows® 操作系统中,它是启用了 CLP 命令窗口的命令行;在这种情况下,必须先(从普通命令窗口)运行 db2cmd 命令来启动 DB2 命令行环境。

db2 命令可以启动命令行处理器。CLP 包括前端进程(表示用户界面)和后端进程,可以用它们来维护数据库连接。每次 db2 调用都启动新的前端进程;第一次 db2 调用要启动后端进程。拥有相同父进程的所有前端进程都是由一个后端进程提供服务的,因此它们共享一个数据库连接。QUIT 命令停止命令行处理器,但是不删除关联的后端进程;要删除关联的后端进程,需要发出 TERMINATE 命令。建议在停止实例(STOP DATABASE MANAGER 或 db2stop)之前执行 TERMINATE 命令;否则,后端进程会保持一个不再可用的实例连接(Attachment)。

db2 命令

可以用下列三种模式之一启动 CLP:

命令模式。在这种模式下,每个命令或 SQL 语句必须添加前缀 db2。在 Windows 操作系统中,DOSKEY 命令允许使用 Up Arrow(向上箭头)键在会话的命令历史记录上滚动,并重新发出命令,而无需再次输入该命令。还可以创建包含 DB2 命令或 SQL 语句的命令文件,并像运行其他任何命令文件那样运行该文件。例如,名为 myfile.cmd 的文件包含下列代码:

db2start 
db2 connect to sample 
db2 select * from org 
db2 terminate 
db2stop 

可以通过从 Windows DB2 命令提示符发出 myfile 来运行该文件。

交互输入模式。可以通过发出 db2 命令同时不指定其他任何东西来启动该模式。交互输入模式的特点在于默认 db2 => 命令提示符。从该提示符下发出的命令和语句没有前缀 db2:

elk /home/melnyk>db2 
... 
db2 => connect to sample 
  Database Connection Information 
 Database server    = DB2/6000 8.2.0 
 SQL authorization ID  = MELNYK 
 Local database alias  = SAMPLE 
db2 => select * from org 
DEPTNUMB DEPTNAME    MANAGER DIVISION  LOCATION 
-------- -------------- ------- ---------- ------------- 
   10 Head Office    160 Corporate New York 
   15 New England     50 Eastern  Boston 
   20 Mid Atlantic    10 Eastern  Washington 
   38 South Atlantic   30 Eastern  Atlanta 
   42 Great Lakes    100 Midwest  Chicago 
   51 Plains       140 Midwest  Dallas 
   66 Pacific      270 Western  San Francisco 
   84 Mountain      290 Western  Denver 
 8 record(s) selected. 
db2 => terminate 
DB20000I The TERMINATE command completed successfully. 
elk /home/melnyk> 

现在可以定制该提示符,并访问当前会话的命令历史记录;有关详细信息,请参阅 New usability features in the interactive CLP。要退出交互输入模式,可以返回操作系统提示符,然后发出 QUIT 命令或 TERMINATE 命令。

批处理模式。该模式允许运行命令脚本、文本文件中的 DB2 命令或 SQL 语句,这些脚本、文本文件按其执行顺序包含命令和语句。在该例中,可以在 db2 命令中使用 -f 选项标记(参见表 1)来指定命令脚本的名称。例如,名为 myscript.db2 的文件包含下列代码:

!db2start; 
connect to sample; 
select * from org; 
terminate; 

可以通过从 DB2 命令提示符发出 db2 -tf myscript.db2 来运行该文件。注意这个文件与上面显示的 myfile.cmd 在内容上的差别。在该例中,文件中的命令和语句没有前缀 db2。每个命令或语句以分号结尾;实际上,通过在 db2 命令中指定 -t 选项标记,我们指示 CLP 使用分号作为语句终止字符。您可能还注意到 db2start 命令前的感叹号,这说明该命令不是 CLP 命令,而是从操作系统提示符发出的系统命令。这个感叹号是换码符,允许您从交互输入模式或批处理模式发出操作系统命令。

图 1 显示了完整的 db2 命令语法。选项包括用来配置 CLP 会话的一个或多个选项标记的规范(表 1)、要执行的 DB2 命令或 SQL 语句、一般 CLP 帮助请求(?),或者与特定命令相关的帮助文本(? phrase)、 SQLCODE(? message)、SQLSTATE(? sqlstate)或类代码(? class-code);有关类代码的详细信息,请参阅 SQLSTATE Messages)。您还可以请求 CLP 选项的当前设置(? options),或者请求关于阅读在线帮助语法表的信息(? help)。下例说明了其中一些选项:

db2 -tvf myscript.db2   => option flags 
db2 connect to sample   => SQL statement 
db2 list tables for user => DB2 command 
db2 ?           => general CLP help 
db2 ? options       => current CLP options settings 
db2 ? help        => help for syntax online help 
db2 ? backup       => help for a specific DB2 command 
db2 ? sql0117N      => help for a specific SQLCODE 
db2 ? 42501        => help for a specific SQLSTATE 
db2 ? 01         => help for a specific class code 

下面是需要记住的与 db2 命令有关的其他一些要点:

问号(?)与后面的文本字符串之间至少要隔开一个空格。

CLP 将前缀为两个连字符的所有文本字符串都解释为注释。

在 CLP 命令模式或交互输入模式下,可以将反斜线字符(\)用作行连续字符。CLP 遇到行连续符时,它会读取下一行并将两行连接起来。在 Windows 操作系统中,行连续字符生成临时 db2 (cont.) => 提示符。

如果 db2 命令返回的消息文本过长,那么可以考虑使用“more”分屏显示(如果可以在操作系统中使用的话),或将输出重定向到一个文件中。例如:

db2 "? sql0510" | more 
db2 "? SQL0510" > sql0510n.out 

也可以使用 -r 或 -z CLP 选项将输出重定向到文件中(参见表 1)。例如:

db2 -r mydata\orglist.txt "select * from org" 

建议在基于 Linux 和 UNIX 的系统中使用双引号分隔符。如果在 CLP 命令模式下使用了特殊字符,那么这些特殊符号将由操作系统 shell 解释。这可能会生成意想不到的结果,除非使用双引号或换码符(如反斜线字符 \)。例如,在 AIX® Korn shell 环境中执行下列命令时,如下所示:

db2 select * from employee where edlevel > 18 

该命令被解释为“选择 employee 表中所有 edlevel 大于 18 的记录,并将输出重定向到名为‘18’的文件”。下列命令将返回正确的输出:

db2 "select * from employee where edlevel > 18" 
db2 select \* from employee where edlevel \> 18 

CLP 将“NULL”(以大写字符指定)识别为空字符串。例如:

db2 update database configuration using mirrorlogpath NULL 

图 1. db2 命令的语法

表 1. CLP 选项标记

选项 描述(默认)
-a显示 SQLCA 数据。(OFF)
-c自动提交 SQL 语句。(ON)
-e{c|s}将 SQLCODE 或 SQLSTATE 数据写入标准输出。(OFF)
-f filename 接受指定文件(命令脚本)中的输入。如果其他选项与 -f 选项一起指定,必须最后指定 -f 选项。(OFF)
-l filename 将日志记录写入指定文件。该文件包含已执行命令和语句的历史记录。如果该文件已经存在,则新的信息会添加在该文件的后面。如果其他选项与 -l 选项一起指定,必须最后指定 -l 选项。(OFF)
-n保留分隔符号内换行字符前的所有尾部空格字符。例如:
create table t1 (c1 varchar(30)); 
insert into t1 values ('123  
789'); 
-- three blanks spaces follow '123 
update command options using n on; 
insert into t1 values ('123  
789'); 
select * from t1; 
C1 
------------------------------ 
123 789 
123  789 
 2 record(s) selected. 

-n 选项必须与 -t 选项一起使用。(OFF)
-o将数据和消息都写入标准输出。(ON)
-p处于 CLP 交互模式下时显示提示符。(ON)
-r filename 将输出(消息和错误代码除外)重定向到指定的文件。如果该文件已经存在,则将新的消息添加到文件的后面。如果 -a 选项与 -r 选项一起指定,那么将 SQLCA 数据也写入文件中。-r 选项不影响 -e 选项。如果指定了 -e 选项,那么 SQLCODE 或 SQLSTATE 数据被写入标准输出,而不是被写入文件中。(OFF)
-s如果执行命令脚本时或在处于 CLP 交互模式下时发生错误,那么可以使用这个选项停止处理;将错误消息写入标准输出。如果禁用该选项,则会显示错误消息,并继续执行剩余命令或语句;只有发生系统错误时才停止执行。(OFF)
-t使用分号(;)作为语句终止符号。该选项禁用反斜线(\)行连续字符。(OFF)
-tdx 使用 x 作为语句终止字符。(OFF)
-v将输入文本回送到标准输出。(OFF)
-w显示 SQL 语句警告消息。(ON)
-x返回没有任何标题(包括列名)的数据。(OFF)
-z filename 将所有输出(包括任何消息或错误代码)重定向到指定的文件。如果该文件已经存在,则将新的信息添加到文件的后面。如果 -a 选项与 -z 选项一起指定,那么还要将 SQLCA 数据也写入文件中。-z 选项不影响 -e 选项。如果指定了 -e 选项,那么要将 SQLCODE 或 SQLSTATE 数据写入标准输出,而不是写入文件中。(OFF)

CLP 选项通常可以以任何顺序和组合来指定。要开启选项,则需要在相应的选项字符前加上减号(例如,-f)。要关闭选项,则需要在选项字母前加上加号,或者在选项字母两边分别加上减号(例如,+c 等于 -c-;关于要自动提交 SQL 语句这种情况的例子,请参阅 Enhanced Savepoints)。

可以使用 LIST COMMAND OPTIONS 命令查看 CLP 选项的当前设置。通过发出 UPDATE COMMAND OPTIONS 命令,可以在 CLP 交互输入模式或批处理模式下更改这些设置。例如:

db2 => update command options using c off p off 

在交互会话或批处理输入结束时,这些设置恢复为它们的原始值。

还可以使用 DB2OPTIONS 注册变量设置会话的 CLP 选项。例如:

export DB2OPTIONS='+c -p-' => Linux and UNIX-based systems 
set DB2OPTIONS=+c -p-    => Windows operating systems 

该命令关闭 SQL 语句的自动提交,并删除在 CLP 交互输入模式下显示的提示符。

交互 CLP 中的新的可用功能

DB2 UDB Version 8.1 引入了针对 DB2 CLP 的一些易用性方面的重要改进。现在可以对在交互模式下使用 CLP 时出现的提示符进行定制。还可以使用新的命令缓存来运行以前执行的命令,或者使用操作系统的集成命令编辑器或选择的编辑器来编辑那些命令。

定制的 CLP 提示符可以显示当前用户、实例连接或数据库连接。要定义命令提示符,则需要设置新的名为 DB2_CLPPROMPT 的 DB2 UDB 注册变量。DB2_CLPPROMPT 注册变量可以设置为任何文本字符串,最大长度为 100 个字符。定制的字符串可以包含任意符号,在运行的时候,实际值将替代这些符号。侧栏中描述了可以设置的符号。

清单 1 显示了如何使用 db2set 命令设置 DB2_CLPPROMPT 注册变量的值。(等号两旁一定不要有空格!)在通过发出 db2 命令调用 CLP 交互模式时,得到的命令提示符会反映所进行的更改。并且一旦建立了数据库连接,定制的提示符还会显示所连接数据库的别名。要更改定制的提示符,可以退出 CLP 交互模式(发出 QUIT 命令),然后再次发出 db2set 命令,并指定不同的字符串。在本例中,使用换行字符符号生成了一种“多行”提示符。

清单 1. 定制 CLP 的交互提示符

elk /home/melnyk>db2set db2_clpprompt="(Instance: %i, Database: %d):" 
elk /home/melnyk>db2 
(c) Copyright IBM Corporation 1993,2002 
Command Line Processor for DB2 SDK 8.2.2 
... 
(Instance: MELNYK, Database: ):connect to sample 
  Database Connection Information 
 Database server    = DB2/6000 8.2.2 
 SQL authorization ID  = MELNYK 
 Local database alias  = SAMPLE 
(Instance: MELNYK, Database: SAMPLE):quit 
DB20000I The QUIT command completed successfully. 
elk /home/melnyk>db2set db2_clpprompt="(Instance:%i%n Database:%d):" 
elk /home/melnyk>db2 
(c) Copyright IBM Corporation 1993,2002 
Command Line Processor for DB2 SDK 8.2.2 
... 
(Instance:MELNYK 
 Database:):connect to sample 
... 
(Instance:MELNYK 
 Database:SAMPLE): 

DB2_CLPPROMPT 注册变量的有效符号

这个 DB2 注册变量允许为 CLP 交互模式定义新的提示符。通过将该变量设置为长度不大于 100 个字符的文本字符串来完成这项操作。该字符串包含下列符号中的一个或多个:

%i。当前实例连接的本地别名。如果没有实例连接,则用 DB2INSTANCE 注册变量的值替代 %i 。如果未设置 DB2INSTANCE 注册变量(只在 Windows 操作系统上),则用 DB2INSTDEF 注册变量的值替代 %i。如果这两个变量都没有设置,则用空字符串替代 %i。

%d。当前数据库连接的本地别名。如果没有数据库连接,则用 DB2DBDFT 注册变量的值替代 %d。如果没有设置 DB2DBDFT 变量,则用空字符串替代 %d。

%ia。当前实例连接的授权 ID。如果没有实例连接,则用空字符串替代 %ia。

%da。当前数据库连接的授权 ID。如果没有数据库连接,则用空字符串替代 %da。

%n。换行字符。

对于 CLP 交互运行时环境,DB2 UDB Version 8 还包括一些有用的命令缓存。这项功能允许恢复(查看、编辑或运行)交互会话过程中输入的任何命令。

新的 HISTORY 命令允许访问此缓存的内容,对于历史记录中的每个命令,返回内容时都要带上序号;这些序号显示了命令运行的顺序。最近运行的命令列在最后。如果想按倒序列出命令,HISTORY 命令允许指定 REVERSE 关键字。默认情况下,命令缓存最多存放当前交互 CLP 会话过程中运行的二十个命令。命令历史记录不会在会话与会话之间持续;会话结束时,缓存就会被清除,这通常发生在运行 QUIT 命令之后。如果启动两个单独的交互 CLP 会话,每个会话的命令历史记录都存储在单独的缓存中。

具有命令缓存的真正好处在于可以使用新的 RUNCMD(或 R)命令执行缓存中的任何命令。不仅可以执行命令,而且可以使用 EDIT(或 E)命令自由编辑缓存的命令,然后以几乎无缝的操作顺序来运行该命令,这有时称为“往返编辑”。

RUNCMD 和 EDIT 都允许指定命令序号来标识要编辑或运行的缓存命令。如果不指定序号,那么系统会检索最近运行的命令。

清单 2 说明了这项功能。该清单延续清单 1 的结尾;开始先对随 DB2 UDB 提供的 SAMPLE 数据库中的 ORG 表运行简单的 SELECT 语句。随后的 HISTORY 命令调用显示了到目前为止该会话中已运行的三个命令或语句:CONNECT、SELECT 和 HISTORY。我们将调用 EDIT 命令,并在顺序中指定语句序号 2,通过这些操作给上面的 SELECT 语句添加 WHERE 子句。在这个运行于 AIX 系统中的例子中,我们还明确指定 vi 编辑器。还可以省去任选的 EDITOR 子句,例如,将 DB2_CLP_EDITOR 注册变量的值设置为“vi”:

db2set db2_clp_editor="vi"

因为已经选择关闭编辑器时保存更改,所以更新的语句会出现在交互 CLP 提示符之后,我们可以选择立即执行该语句。再次调用 HISTORY 命令来显示缓存中现在有 5 个命令,包括修改的 SELECT 语句。

清单 2. 使用 CLP 命令缓存和“往返编辑”

(Instance:MELNYK 
 Database:SAMPLE):select * from org 
DEPTNUMB DEPTNAME    MANAGER DIVISION  LOCATION 
-------- -------------- ------- ---------- ------------- 
   10 Head Office    160 Corporate New York 
   15 New England     50 Eastern  Boston 
   20 Mid Atlantic    10 Eastern  Washington 
   38 South Atlantic   30 Eastern  Atlanta 
   42 Great Lakes    100 Midwest  Chicago 
   51 Plains       140 Midwest  Dallas 
   66 Pacific      270 Western  San Francisco 
   84 Mountain      290 Western  Denver 
 8 record(s) selected. 
(Instance:MELNYK 
 Database:SAMPLE):history 
1  connect to sample 
2  select * from org 
3  history 
(Instance:MELNYK 
 Database:SAMPLE):edit editor vi 2 
  ... 
select * from org where location = 'Chicago' 
~ 
~ 
~ 
... 
~ 
~ 
~ 
:q 
(Instance:MELNYK 
 Database:SAMPLE):select * from org where location = 'Chicago' 
Do you want to execute the above command ? (y/n) y 
DEPTNUMB DEPTNAME    MANAGER DIVISION  LOCATION 
-------- -------------- ------- ---------- ------------- 
   42 Great Lakes    100 Midwest  Chicago 
 1 record(s) selected. 
(Instance:MELNYK 
 Database:SAMPLE):history reverse 
5  history reverse 
4  select * from org where location = 'Chicago' 
3  history 
2  select * from org 
1  connect to sample 
(Instance:MELNYK 
 Database:SAMPLE): 

示例 CLP 脚本

DB2 UDB 提供了示例 CLP 脚本,可以对随 DB2 提供的 SAMPLE 数据库运行这些脚本。在基于 Linux 和 UNIX 的系统中,这些脚本位于 /sqllib/samples/clp 目录中;在 Windows 操作系统中,它们则位于 \SQLLIB\samples\clp 目录中。同时提供的 README 文件描述了命令脚本以及如何运行它们。

Command Editor

Command Editor (前身为 Command Center) 是 CLP 的图形用户界面(GUI)。它以记事本方式显示,可以通过从 Windows Start 菜单(Start → Programs → IBM DB2 → Command Line Tools → Command Editor)发出 db2ce 命令打开它,或者从 Control Center 的工具栏(图 2)打开它。

图 2. Command Editor 记事本可以从 Control Center 打开

一打开 Command Editor,可以立即在 Commands 页面中输入信息(图 3)。然后可以开始将文本输入(或将文本粘贴到)Command Input 窗口中,确保每个命令或 SQL 语句以语句分隔符号结束。默认语句分隔符为分号,也可以被修改。还可以从文件系统或从 Task Center 导入以前保存的脚本(Selected → Open)。在准备好运行命令或 SQL 语句时,可以单击 Execute 按钮。

如果选择了目标数据库,Command Editor 记事本的 Query Results 和 Access Plan 页面变为可用状态。Query Results 页面允许查看和处理单个 SQL 查询的结果。还可以更改字段的值,或在该页面中删除或插入整行,然后提交或回滚恢复所进行的更改!运行这样的查询后,Command Output 窗口(Commands 页面的下面部分)将回送该查询,并显示查询状态。Access Plan 页面提供可解释 SQL 语句(如 SELECT、INSERT 或 UPDATE)的访问计划(访问所请求数据的操作顺序)的图形表示。

图 3. Command Editor 是分为三页的用于输入命令和检索结果的记事本

  查看原图(大图)

可以通过选择 Selected → History,或通过单击 History 图标 ,来检索命令历史记录。如果在 Command History 窗口中选择的命令或 SQL 语句特别长,且在 Commands 面板中被截断,则完整的命令或语句会显示在 Details 面板中(图 4)。

图 4. Command History 窗口

  查看原图(大图)

用图 3 或图 4 中的 SQL 语句将创建一个 SQL 过程,这是主体用 SQL 编写的存储过程。SQL 过程是定义较复杂的查询或任务的一种有用方法,这些查询或任务可以在需要时随时调用。例如,如果名为 createSQLproc.db2 的 CLP 脚本中包含这个语句,则可以通过发出下列命令创建这个过程:

db2 connect to sample 
db2 -td@ -vf createSQLproc.db2 
db2 connect reset 

这条 db2 命令指定了以下几个选项:-td 选项,告诉命令行处理器定义并使用 @ 作为语句终止字符(过程主体已经使用分号作为其语句终止字符);-v 选项,告诉 CLP 将命令文本回送到标准输出中; -f 选项,告诉 CLP 从指定文件而不是从标准输入读取输入。SALES_STATUS 过程接受名为 quota 的输入参数,并返回名为 sql_state 的输出参数。过程主体由单个 SELECT 语句组成,该语句返回总销售额超过指定配额的每个销售人员的姓名及总销售数字。

图 5 显示了如何使用 Command Editor 调用这个存储过程,使用的配额值为 25。

图 5. 使用 Command Editor 调用 SQL 过程

您可能还想将这个过程保存为脚本,以便以后运行,或者计划定期运行。可以通过将语句保存到文件系统或 Task Center 中做到这一点(Selected → Save;参见图 6)。

图 6. 将命令脚本保存到 Task Center

在这里,打开 Task Center 的最简单方法是单击 Command Editor 工具栏中的 Task Center 图标

图 7. Task Center

  查看原图(大图)

SALES STATUS 显示在任务列表中(图 7)。右击此任务或打开 Selected 下拉菜单会提供可能运行操作的列表,其中包括现在运行任务(图 8)或计划以后运行任务的操作。

图 8. 从 Task Center 运行命令脚本

一旦任务已经运行,便可以通过右击任务或打开 Selected 下拉菜单,然后选择 Show Results 操作,来检查执行结果。如果有执行和脚本的详细信息,那么打开的 Show Results 记事本中会提供这些信息(图 9)。

图 9. 从 Task Center 查看命令脚本执行的结果

结束语

我们已经看到 DB2 UDB 命令行处理器是用于访问 DB2 函数的方便且通用的接口。DB2 CLP 可以从 DB2 命令行调用、通过命令脚本调用,甚至通过图形用户界面来调用。文中使用了许多例子来说明根据偏好使用和定制 CLP 的不同方法。我希望您进一步进行研究,开发自己的脚本,以此作为增进对 DB2 的理解以及有效管理数据库的一种方式。

Tags:DB 基础 DB

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