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变量时,使用&标号直接引用其原有值,而不需要输入数据