Oracle 中的 & 符号详解

在 Oracle 数据库中,& 是一个常用于 替代变量(substitution variable) 的符号,广泛应用于 SQL*Plus、SQL Developer、Toad 等客户端工具中。当需要在 SQL 脚本中进行用户输入或者实现动态 SQL 语句时,& 符号就非常有用了。

本文将详细介绍 & 符号的作用、用法、注意事项以及相关的设置控制。


一、& 符号的作用

& 用于提示用户输入变量值,并将其替换到 SQL 语句中执行。这种机制被称为 变量替换(substitution variable)

例如:

 SELECT * FROM emp WHERE deptno = &dept_id;

在执行时,客户端会提示你输入一个值,比如 10,最终执行的 SQL 就是:

 SELECT * FROM emp WHERE deptno = 10;

二、单个 & 与双 && 的区别

1. 单个 &

单个 & 会在每次出现时都提示输入:

 SELECT '&name' AS name1, '&name' AS name2 FROM dual;

运行时会提示两次输入 name,例如你输入了 TomJerry,结果如下:

NAME1

NAME2

Tom

Jerry

2. 双 &&

&& 仅在 SQL*Plus 和某些 命令行工具中生效

如果你在 PL/SQL 块、存储过程、普通 SQL 脚本 中写 &&,它不会被 Oracle 解析为操作符,而会导致语法错误。

&&第一次提示输入,后续自动使用第一次的值

 SELECT '&&name' AS name1, '&&name' AS name2 FROM dual;

输入一次 Tom 后,后续所有 &&name 都会替换成 Tom,结果如下:

NAME1

NAME2

Tom

Tom


三、定义替代变量

可以使用 DEFINE 来预先定义变量:

 DEFINE dept_id = 20
 ​
 SELECT * FROM emp WHERE deptno = &dept_id;

在这种情况下,不再提示输入,&dept_id 会被替换成 20

要查看定义的变量:

 DEFINE

要删除某个变量:

 UNDEFINE dept_id

四、设置提示符

使用 SET DEFINE 可以控制替代变量的行为。

  • 关闭替代变量功能:

 SET DEFINE OFF

关闭后,& 将被视为普通字符,不再提示输入。

  • 更改提示符,例如改成 #

 SET DEFINE #

这样写就不会提示输入:

 SELECT * FROM emp WHERE deptno = #dept_id;

五、在 PL/SQL 中的注意事项

在 PL/SQL 块中使用 & 符号时,仍然会触发替换行为:

 BEGIN
   DBMS_OUTPUT.PUT_LINE('&msg');
 END;

执行时会提示输入 msg 的值。这在调试过程中可以临时传参。


六、实际应用示例

示例:动态查询不同部门员工

 ACCEPT dept_no PROMPT '请输入部门编号:'
 ​
 SELECT empno, ename, sal
 FROM emp
 WHERE deptno = &dept_no;

运行时用户输入值后,将自动带入 SQL 执行。


七、总结

项目

说明

&变量名

每次都会提示输入变量值

&&变量名

只提示一次,后续自动使用第一次的值

DEFINE

定义替代变量

UNDEFINE

取消变量定义

SET DEFINE OFF

禁用替代变量功能

SET DEFINE 字符

更换替代变量触发符号(如改为 #


八、注意事项

  • & 符号是客户端行为,在 Oracle 服务器端 SQL 中并不存在。

  • 一些图形化工具(如 PL/SQL Developer)默认关闭变量替换功能,使用时需注意设置。

  • 替代变量适合用于编写 可交互的 SQL 脚本,不适合在自动化脚本或存储过程内使用。