绑定变量和我使用&&amp ;?输入的变量之间有什么区别?

时间:2011-10-16 06:41:29

标签: oracle variables plsql declaration sqlplus

这两个变量声明之间有什么区别?

1:num number:='&&num';
2:variable num1 number;

由于在这两种情况下我都可以在其他文件中使用num&num来引用&&num, 在绑定变量:num1的情况下。

此外,我还有一个困惑:以下任何一种陈述是否有所不同,它们是否有效,是否意味着同样的事情?

1:variable num1 number;
2:var num1 number;

1 个答案:

答案 0 :(得分:29)

您似乎对Oracle中的绑定变量与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,所以我们得到了一个错误。

oldnew开头的行显示我们在SQL * Plus应用替换变量之前和之后输入的行。 new行是数据库尝试运行的行。

您可以使用oldnew启用或停用SET VERIFY ONSET VERIFY OFF行的显示。您还可以使用SET DEFINE ONSET 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

如果&subvar碰巧包含一个有效数字的字符串(例如5),那么我们可以在不使用引号的情况下离开,但这只是因为取出了{{1}文本并将其替换为文本&subvar恰好为我们提供了有效的SQL。

例如,假设我们有一个名为5的表,其中包含以下数据:

         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

在上面的第二个示例中,我们没有返回任何行,因为test表没有包含文本DUAL的{​​{1}}列的行。

如果您尝试将错误类型的值分配给绑定变量,则会收到错误:

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或任何连接到您选择的数据库的方法一起使用。


最后,DUMMY:bindvar都意味着同样的事情。它们都定义了variable num1 number类型的绑定变量var num1 numbernum1只是number的缩写。