2.2.2 编辑缓冲区的内容

缓冲区真正的意义在于用户可以编辑其中的内容,这样如果语句执行出错,用户可以很方便地进行修改,特别是长的、复杂的SQL语句或者PL/SQL块。

使用最频繁的编辑命令是edit(或ed)。这条命令的作用是打开默认的编辑器(在Windows环境中为记事本),并将缓冲区中的内容放在编辑器中。用户可以在编辑器中修改缓冲区中的内容,修改完后保存并退出编辑器,然后在SQLPlus中输入/命令,修改后的内容将在SQLPlus中执行。图2.2显示的是当一条SQL语句执行出错时,用edit命令打开编辑器的情况。

figure_0070_0016

图 2.2 缓冲区内容的编辑

执行edit命令时,SQL*Plus在操作系统当前目录中建立了一个临时文件,用来保存当前缓冲区的内容。这个文件的默认文件名为“afiedt.buf”。需要注意的是,在这个临时文件中并不保存所有已经执行的SQL语句或者PL/SQL块,仅当执行edit命令时,才将当前缓冲区中的内容写入这个文件,文件中以前的内容将被覆盖。

如果要显示缓冲区中的内容,可以执行list(或者l)命令。list命令以分行的形式显示缓冲区的内容,并在每一行前面显示行号。如果要显示某一行的内容,可以在list命令之后指定行号,这样只显示指定的一行,并使这一行成为当前行,而不是显示所有内容。例如,假设在缓冲区中已经有一条SQL语句,我们可以以不同的形式执行list命令:


SQL>list

1 SELECT ename

2 FROM emp

3*WHERE deptno=10

SQL>l 2

2*FROM emp

SQL>l3

3*WHERE deptno=10


还有一种简单的方法用来显示某一行的内容。在SQL*Plus提示符下直接输入一行的行号,结果与将行号作为参数的list命令是等价的。

append命令(或者a)的作用是在缓冲区中当前行的末尾追加文本。在默认情况下,最后一行是当前行。如果以某一行的行号作为参数执行了list命令,那么指定的行将成为当前行。append命令的格式为:


append文本


append将把指定的文本追加到当前行的末尾。注意追加的文本不需要用引号限定,否则引号将作为文本的一部分一起被追加。例如,对于前面的SELECT语句,如果希望在刚才的基础上再检索sal列的值,那么可以在第一行的末尾追加文本“,sal”。追加的步骤为:


SQL>l1

1*SELECT ename

SQL>append, sal

1*SELECT ename, sal


这样,缓冲区中第一行的内容由原来的“SELECT ename”变为“SELECT ename, sal”,SELECT语句执行的结果将检索ename和sal两个列的值。

append命令的作用是在当前行的末尾追加文本。如果要在缓冲区中增加一行,就要使用input命令。input命令(或者i)的作用是在当前行之后追加一行或者多行。在默认情况下,input命令在最后一行之后追加文本。如果要在某一行之后追加,应该先执行list命令使该行成为当前行,然后再追加。

使用input命令追加文本时,可以只追加一行,这时input命令的格式为:


input文本


如果要追加多行,则输入不带参数的input命令并回车,这时行号将变成ni的形式,其中n是从当前行号的下一个数字开始的整数,表示该行内容是追加到缓冲区中的。追加结束后以一个空行和回车符结束。例如,假设当前缓冲区中有一条不完整的SQL语句,现在希望把它补充完整。当前缓冲区显示的结果为:


SQL>list

1 SELECT ename

2*AND sal>1000


在第一行之后增加FROM子句和WHERE子句,操作步骤如下:


SQL>list 1

1*SELECT ename

SQL>input

2i FROM emp

3i WHERE deptno=10

4i

SQL>


当前缓冲区中的内容为:


SQL>list

1 SELECT ename

2 FROM emp

3 WHERE deptno=10

4*AND sal>1000


注意,在追加多行时,input命令为追加的新行重新显示了行号,即上面的2i、3i等。输入结束后,在下一行直接回车,这时重新显示SQL*Plus提示符,追加操作便告结束。

如果发现缓冲区中内容有错误,可以用edit命令打开编辑器,在编辑器中进行修改。还有一种修改方法,就是change命令。change(或者c)命令的作用是在缓冲区中当前行上用新的字符串代替旧的字符串。这条命令的格式为:


change/新字符串/旧字符串


例如,要把上面修改后的SELECT语句中的最后一个条件“sal>1000”改为“comm is not null”,操作的步骤为:


SQL>list 4

4*and sal>1000

SQL>change/sal>1000/comm is not null/

4*and comm is not null


重新显示的结果表明这一行的内容已经被修改。

如果要清空缓冲区中的内容,可以执行del命令。当缓冲区被清空后,就不能再执行edit命令进行编辑,也不能再执行list命令进行显示了。如果只删除缓冲区中的一部分内容,则通过edit和list命令可以显示剩下的内容。

在默认情况下,del命令删除缓冲区中当前行的全部内容。但是通过指定参数,del命令可以删除指定的一行或者多行。del命令的格式有以下形式:

·del开始行号结束行号删除开始行号和结束行号之间的行。

·del开始行号*删除开始行号和当前行之间的行。

·del*结束行号删除当前行和结束行号之间的行。

·del last删除最后一行。

其中开始行号和结束行号是指定的行号,开始行号必须小于结束行号。符号“*”用来代表当前行,标识符last代表最后一行。