您似乎对 Oracle 中的绑定变量和 SQL*Plus 中的替换变量之间的区别有些混淆。
让我们从替换变量开始。替换变量是 SQL*Plus 独有的,不是数据库的一部分。例如,如果您尝试将它们与 JDBC 一起使用,它们将不起作用。
替换变量只能容纳一段文本。如果 SQL*Plus 在输入行中遇到替换变量,它将用其文本内容替换该变量:
SQL> 定义子变量=X
SQL> select * from dual where dummy = &subvar;
旧 1: select * from dual where dummy = &subvar
新 1: select * from dual where dummy = X
select * from dual where dummy = X
*
第 1 行的错误:
ORA-00904: "X": 无效标识符
请注意,SQL*Plus 用它的文本值替换了我们的替换变量,而不考虑它是否给了我们有效的 SQL。在上面的例子中,我们省略了 &subvar 周围的单引号,它给了我们无效的 SQL,所以我们得到了一个错误。
以old 和new 开头的行显示了我们在SQL*Plus 应用替换变量之前和之后输入的行。 new 行是数据库尝试运行的行。
您可以使用SET VERIFY ON 和SET VERIFY OFF 启用或禁用old 和new 行的显示。您还可以使用SET DEFINE ON 和SET DEFINE OFF 打开或关闭替换变量的替换。
如果我们想使用替换变量运行上述查询,我们必须在它周围加上引号:
SQL> select * from dual where dummy = '&subvar';
旧 1: select * from dual where dummy = '&subvar'
新 1: select * from dual where dummy = 'X'
D
-
X
如果&subvar 恰好包含一个有效数字的字符串(例如5),那么我们可以不使用引号而逃脱,但这只是因为取出文本&subvar 并将其替换为text 5 恰好给了我们有效的 SQL。
例如,假设我们有一个名为test 的表,其中包含以下数据:
一种
----------
1
2
3
4
5
那我们就可以了
SQL> 定义子变量=5
SQL> select * from test where a = &subvar;
旧 1: select * from test where a = &subvar
新 1:从测试中选择 * a = 5
一种
----------
5
另一方面,绑定变量具有类型。它们不是简单的文本值。它们的值被发送到数据库,数据库也可以设置它们的值。
SQL> 变量 bindvar varchar2(1);
SQL> 执行 :bindvar := 'X';
PL/SQL 过程成功完成。
当你想使用绑定变量时,不要在它周围加上引号:
SQL> select * from dual where dummy = :bindvar;
D
-
X
SQL> select * from dual where dummy = ':bindvar';
未选择任何行
在上面的第二个示例中,我们没有返回任何行,因为 DUAL 表中没有包含 :bindvar 文本的 DUMMY 列的行。
如果您尝试将错误类型的值分配给绑定变量,则会出现错误:
SQL> 变量绑定变量号;
SQL> 执行 :bindvar := 'X';
开始 :bindvar := 'X';结尾;
*
第 1 行的错误:
ORA-06502: PL/SQL: 数字或值错误: 字符到数字的转换错误
ORA-06512: 在第 1 行
绑定变量是数据库的标准部分,您可以将它们与 JDBC 或您选择的任何连接到数据库的方法一起使用。
最后,variable num1 number 和 var num1 number 的含义相同。它们都定义了number 类型的绑定变量num1。 var 只是variable 的缩写。