您似乎对之间的差异有些困惑绑定变量在甲骨文中和替代变量在 SQL*Plus 中。
让我们从替换变量开始。替换变量是 SQL*Plus 所特有的,并且不是数据库的一部分。例如,如果您尝试将它们与 JDBC 一起使用,它们将无法工作。
替换变量只能保存一段文本。如果 SQL*Plus 在输入行中遇到替换变量,它将用其文本内容替换该变量:
SQL> define subvar=X
SQL> select * from dual where dummy = &subvar;
old 1: select * from dual where dummy = &subvar;
new 1: select * from dual where dummy = X
select * from dual where dummy = X
*
ERROR at line 1:
ORA-00904: "X": invalid identifier
请注意,SQL*Plus 用其文本值替换了我们的替换变量,而不考虑它是否为我们提供了有效的 SQL。在上面的例子中,我们省略了单引号&subvar
它给了我们无效的 SQL,所以我们得到了一个错误。
行开始old
and new
显示 SQL*Plus 应用替换变量之前和之后输入的行。这new
line 是数据库尝试运行的行。
您可以启用或禁用该显示old
and new
线路使用SET VERIFY ON
and SET VERIFY OFF
。您还可以使用以下命令打开或关闭替换变量的替换SET DEFINE ON
and SET DEFINE OFF
.
如果我们想使用替换变量运行上面的查询,我们必须在它周围加上引号:
SQL> select * from dual where dummy = '&subvar;';
old 1: select * from dual where dummy = '&subvar;'
new 1: select * from dual where dummy = 'X'
D
-
X
If &subvar
恰好包含一个有效数字的字符串(例如5
),那么我们就可以不使用引号了,但这只是因为取出了文本&subvar
并将其替换为文本5
恰好给了我们有效的 SQL。
例如,假设我们有一个名为test
其中包含以下数据:
A
----------
1
2
3
4
5
那么我们可以做
SQL> define subvar=5
SQL> select * from test where a = &subvar;
old 1: select * from test where a = &subvar;
new 1: select * from test where a = 5
A
----------
5
另一方面,绑定变量有类型。它们不是简单的文本值。它们的值被发送到数据库,数据库也可以设置它们的值。
SQL> variable bindvar varchar2(1);
SQL> exec :bindvar := 'X';
PL/SQL procedure successfully completed.
当你想使用绑定变量时,不要在它周围加上引号:
SQL> select * from dual where dummy = :bindvar;
D
-
X
SQL> select * from dual where dummy = ':bindvar';
no rows selected
在上面的第二个示例中,我们没有返回任何行,因为DUAL
表中没有行DUMMY
包含文本的列:bindvar
.
如果您尝试将错误类型的值分配给绑定变量,您将收到错误消息:
SQL> variable bindvar number;
SQL> exec :bindvar := 'X';
BEGIN :bindvar := 'X'; END;
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 1
绑定变量是数据库的标准部分,您可以将它们与 JDBC 或您选择的任何连接数据库的方法一起使用。
最后,variable num1 number
and var num1 number
两者的意思是一样的。他们都定义了一个绑定变量num1
类型的number
. var
只是一个缩写variable
.