这两个变量声明有什么区别?
1:num number:='&&num';
2:variable num1 number;
因为在这两种情况下我都可以引用 num
通过使用 &num
或 &&num
在其他文件中,
对于绑定(bind)变量 :num1
.
此外,我还有一个困惑:以下任何陈述是否有所不同,它们是否都有效并且它们的意思是一样的?
1:variable num1 number;
2:var num1 number;
最佳答案
您似乎对 Oracle 中的绑定(bind)变量和 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
line 是数据库尝试运行的行。
您可以启用或禁用 old
的显示。和 new
使用 SET VERIFY ON
的行和 SET VERIFY OFF
.您也可以使用 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
并将其替换为文本 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
另一方面,绑定(bind)变量具有类型。它们不是简单的文本值。它们的值被发送到数据库,数据库也可以设置它们的值。
SQL> 变量 bindvar varchar2(1);
SQL> 执行 :bindvar := 'X';
PL/SQL 过程成功完成。
当您想使用绑定(bind)变量时,不要在绑定(bind)变量周围加上引号:
SQL> select * from dual where dummy = :bindvar;
D
-
X
SQL> select * from dual where dummy = ':bindvar';
未选择任何行
在上面的第二个示例中,我们没有返回任何行,因为 DUAL
表中没有 DUMMY
的行包含文本 :bindvar
的列.
如果您尝试将错误类型的值分配给绑定(bind)变量,则会出现错误:
SQL> 变量绑定(bind)变量号;
SQL> 执行 :bindvar := 'X';
开始 :bindvar := 'X';结尾;
*
第 1 行的错误:
ORA-06502: PL/SQL: 数字或值错误: 字符到数字的转换错误
ORA-06512: 在第 1 行
绑定(bind)变量是数据库的标准部分,您可以将它们与 JDBC 或您选择的任何连接到数据库的方法一起使用。
最后,variable num1 number
和 var num1 number
两者的意思相同。他们都定义了一个绑定(bind)变量num1
类型 number
. var
只是 variable
的缩写.
关于oracle - 绑定(bind)变量和替换变量(我使用 && 输入)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7782802/