2.2.2 编辑缓冲区的内容
缓冲区真正的意义在于用户可以编辑其中的内容,这样如果语句执行出错,用户可以很方便地进行修改,特别是长的、复杂的SQL语句或者PL/SQL块。
使用最频繁的编辑命令是edit(或ed)。这条命令的作用是打开默认的编辑器(在Windows环境中为记事本),并将缓冲区中的内容放在编辑器中。用户可以在编辑器中修改缓冲区中的内容,修改完后保存并退出编辑器,然后在SQLPlus中输入/命令,修改后的内容将在SQLPlus中执行。图2.2显示的是当一条SQL语句执行出错时,用edit命令打开编辑器的情况。
图 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代表最后一行。