oracle – 绑定变量和我使用\u0026\u0026输入的变量有什么区别?

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

1:num number:=’&& num’;
2:变量num1号;

因为在这两种情况下我都可以通过在其他文件中使用& num或&& num来引用num,
在绑定变量的情况下:num1.

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

1:变量num1号;
2:var num1号码;

最佳答案
您似乎对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,所以我们得到了一个错误.

从新旧开始的行显示了我们在SQL * Plus应用替换变量之前和之后输入的行.新行是数据库尝试运行的行.

您可以使用SET VERIFY ON和SET VERIFY OFF启用或禁用旧行和新行的显示.您还可以使用SET DEFINE ON和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

如果& subvar碰巧包含一个有效数字的字符串(例如5),那么我们可以在不使用引号的情况下离开,但这只是因为取出text& 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或任何连接到您选择的数据库的方法一起使用.

最后,变量num1 number和var num1 number都意味着相同的事情.它们都定义了类型为number的绑定变量num1. var只是变量的缩写.

转载注明原文:oracle – 绑定变量和我使用\u0026\u0026输入的变量有什么区别? - 代码日志