在Oracle的PL/SQL中,&和:有什么区别?

4

我正在学习PL/SQL,正在学习绑定变量。 我了解到我们使用绑定变量来传递运行时值。

但是在PL/SQL中,&和:(冒号)有什么区别?它们是相同的还是有区别?何时应该使用&和:?

2个回答

11

&仅用于SQL*Plus中,它在其外没有意义。

SQL*Plus“解析”输入缓冲区时,它会将&变量替换为其所定义的内容。详见此链接此链接。技术术语是替换变量

另一方面,:变量真正的绑定变量。它们在Oracle的SQL引擎“解析”并执行SQL语句时使用。详情请见此链接此链接

因此,简而言之,&变量由SQL*Plus替换,然后传递给Oracle的SQL引擎;而:变量由SQL*Plus保持不变,并按原样传递给Oracle的SQL引擎。在SQL*Plus之外,&没有意义。


4
&在PL/SQL中没有意义,它实际上是一个SQL Plus功能(为了兼容性已被复制到Toad、SQL Developer等)。在SQL Plus中,&用于定义一个替换变量,在代码被发送到服务器进行处理之前,由SQL Plus替换为指定的替换文本。
SQL Plus替换变量的正确语法为&name.,即以&开头,以.结尾,但在大多数情况下,.是可选的。因此,当您在SQL Plus中运行此代码时:
select * from emp where ename = '&name.';

SQL Plus提示用户输入一个值name,并在查询运行之前将其替换。因此,如果用户输入KING,则实际运行的SQL为:

select * from emp where ename = 'KING';

多个值怎么办?我尝试了以下语句: select * from emp where ename IN ('&name*.'); - Captain Tyler
1
你可以编写 select * from emp where ename IN (&name.);(注意:&name周围没有引号,也没有星号)然后在提示输入name时输入带引号的数据:'KING','SCOTT','WILSON'。这实际上被替换为:select * from emp where ename IN ('KING','SCOTT','WILSON'); - Tony Andrews

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接