一、替换变量
1.当我们在SQL*Plus中执行命令时,可以使用替换变量,让用户每次执行语句前,为语句传送不同的数据。例如:
gyj@OCM> select * from t1 where id=&id;
Enter value for id: 1 --Oracle首先让我们输入id的值,此处输入1
old 1: select * from t1 where id=&id
new 1: select * from t1 where id=1
ID NAME
---------- ----------
1 gyj1
在你输入值后,Oracle将&id换为你所输入的值,然后,按你所输入的值执行。这就是替换变量。同样的一条语句,你可以每次输入不同的值,返回的就是不同的结果。其实替换变量类似于编程语言中的变量的简单形式。
2.一条语句中,可以有多个替换变量,而且,一条语句中,除了开头第一个单词,语句中的任何一部分,都可以是替换变量。比如:
gyj@OCM> select * from t1 where &a &b &c;
Enter value for a: id
Enter value for b: =
Enter value for c: 1
old 1: select * from t1 where &a &b &c
new 1: select * from t1 where id = 1
ID NAME
---------- ----------
1 gyj1
(显示结果和上面一样)
3.除了语句的第一个单词外,我甚至可以将整个语句,都定为替换变量:
gyj@OCM> select &a &b &c &d &e &f &g;
Enter value for a: *
Enter value for b: from
Enter value for c: t1
Enter value for d: where
Enter value for e: id
Enter value for f: =
Enter value for g: 1
old 1: select &a &b &c &d &e &f &g
new 1: select * from t1 where id = 1
ID NAME
---------- ----------
1 gyj1
注意,SELECT一定不可以是替换变量。语句中第一个单词不可以是替换变量,其他部分都可以。因此替换变量的使用是非常灵活的。
4.对于字符型的数据,要注意单引号的问题,我想显示姓名等于某个人的行,可以使用如下语句:
gyj@OCM> select * from t1 where name='&n';
Enter value for n: gyj1
old 1: select * from t1 where name='&n'
new 1: select * from t1 where name='gyj1'
ID NAME
---------- ----------
1 gyj1
注意:我在’&n’外加的有单引号,那么,我在为n输入值时,就不必再gyj1的外面,加单引号。
如果&n的外面,我没有加单引号的话,如下:
gyj@OCM> select * from t1 where name=&n;
Enter value for n: 'gyj1'
old 1: select * from t1 where name=&n
new 1: select * from t1 where name='gyj1'
ID NAME
---------- ----------
1 gyj1
(显示结果同上)
注意: &n外面没有单引号,那么在输入gyj1时,就要在gyj1之外,加单引号。
二、替换变量的定义和取消
我们可以使用define 变量 = 值 ,事先定义替换变量。如SQL> define a=1 ,这条语句后面可以加“;”,也可以不加“;”号。
定义变量后,可以在任何地方通过&a来引用变量,如:
gyj@OCM> define a=1
gyj@OCM> select * from t1 where id=&a;
old 1: select * from t1 where id=&a
new 1: select * from t1 where id=1
ID NAME
---------- ----------
1 gyj1
和以前使用替换变量相比,少了“输入 a 的值: ”,这次,a的值在前面已经用define定义过了,不必再输入。
变量a可以返复使用,直到使用undefine 变量 命令取消它。下面试一下。
我先用如下语句输出a的值:
gyj@OCM> select &a from dual;
old 1: select &a from dual
new 1: select 1 from dual
1
----------
1
a的值目前还存在。在使用时,不须先为a输入值。下面我取消a。
SQL> undefine a
取消之后,我再次执行和上面同样的命令,输出a的值:
gyj@OCM> undefine a
gyj@OCM> select &a from dual;
Enter value for a:
(这次要求我输入a的值了,因为a已经被取消)
还一点要说明一下,就是替换变量只针对一个会话,在A会话中定义的值的变量,在B会话访问不到它的值。下面我们试一下:
在会话1:SQL> define a=1
在会话1:SQL> select &a from dual;
old 1: select &a from dual
new 1: select 1 from dual
1
----------
1
已经可以使用变量a了。下面换到会话2:
在会话2:SQL> select &a from dual;
输入 a 的值:(要求你重新为a输入值,在会话1中为变量定义的值,在会话2中访问不到)
三、“&&”与替换变量:
一个“&”(念and)号的替换变量,如果以前没有Define定义过。在本次使用完后,将自动取消。而双“&&”号的替换变量,在本次使用完后,输入的值将一直保持,直到用Undefine取消为止。测试如下:
gyj@OCM> select &&a from dual;
Enter value for a: 1
old 1: select &&a from dual
new 1: select 1 from dual
1
----------
1
第一次为&&a输入值为1,再次显示a的值,无论是select &&a from dual; 还是select &a from dual; 都不需要再为a输入值。直到undefine。
四、SET VERIFY ON | OFF
在替换变量使用过程中,每次都会显示一个“原值”,然后显示被命令替换成了“新值”,使用SET VERIFY,可以打开或关闭这个提示信息。默认状态是打开。我把它关闭看看效果:
SQL> set verify off
说明一下,普通的命令,在结尾处都应有一个“;”分号,而Define、Undefine和SET开头的命令,这些命令专门针对SQL*Plus,在其他环境中不能使用。这些专属于SQL*Plus的命令,不必在结尾处加分号。当然如果结尾加分号了,也不会报错。