declare
  v_comm number(6,2);
begin
  select comm into v_comm from emp
  where empno=&&no;
  if v_comm<>0 then
     update emp set comm=v_comm+100
     where empno=&no;
  else 
     update emp set comm=200
     where empno=&no;
  end if;
end;
 
PL/SQL上的例子,输入雇员号,执行if...then...else,由于&&只能输入一次值,会自动保存输入的值,所以导致接下来不会出现要求输入的语句,而按照第一次输入的值直接完成执行。必须退出sqplus重新登录之后方可撤销&&的取值,而如果采用&no的话,则必须输入三次值方可执行,
 
declare
  v_comm number(6,2);
  v_empno emp.empno%TYPE;
begin
  v_empno:=&no;
  select comm into v_comm from emp
  where empno=v_empno;
  if v_comm<>0 then
     update emp set comm=v_comm+100
     where empno=v_empno;
  else
     update emp set comm=200
     where empno=v_empno;
  end if;
end;
 
得益于 包袱 兄弟的帮助,此PL/SQL程序可以很好的解决问题,
另外另我明白&&只取值一次的 天高云淡 大师的例子是:
      是用undef去除&&保存的变量
SQL> select username,password from dba_users where username=upper('&&uname');
输入 uname 的值:  sys
原值    1: select username,password from dba_users where username=upper('&&uname')
新值    1: select username,password from dba_users where username=upper('sys')
USERNAME                       PASSWORD
------------------------------ ------------------------------
SYS
SQL> select username,password from dba_users where username=upper('&&uname');
原值    1: select username,password from dba_users where username=upper('&&uname')
新值    1: select username,password from dba_users where username=upper('sys')
USERNAME                       PASSWORD
------------------------------ ------------------------------
SYS
SQL> undef uname
SQL> select username,password from dba_users where username=upper('&&uname');
输入 uname 的值:  sys
原值    1: select username,password from dba_users where username=upper('&&uname')
新值    1: select username,password from dba_users where username=upper('sys')
USERNAME                       PASSWORD
------------------------------ ------------------------------
SYS
 

今天看到PL/SQL的最后几页,发现了这个恍然大悟

 该标号类似于单个&标号。但需要注意,&标号所定义的替代变量只在当前语句中起作用;而&&标号所定义的变量会在当前SQL*Plus环境中一直生效。当第一次引用no变量时,使用&&标号需要为其输入数据;当第二次引用no变量时,使用&标号直接引用其原有值,而不需要输入数据