oracle - 绑定(bind)变量和替换变量(我使用 && 输入)有什么区别?

标签 oracle variables plsql declaration sqlplus

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

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 numbervar num1 number两者的意思相同。他们都定义了一个绑定(bind)变量num1类型 number . var只是 variable 的缩写.

关于oracle - 绑定(bind)变量和替换变量(我使用 && 输入)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7782802/

相关文章:

回调中的 Javascript 变量范围作为闭包

c++ - 在方法中返回静态变量是个坏主意吗?

SQL Oracle - 如何找到同一个表的最终值?

javascript - 知道变量是否是javascript中的 native 对象

java - Oracle SQL/Java : Get the size of returned dataset from a query

dataframe - 在 Dataframe 上查看 "iterating"的进度

sql - 没有连接的 Oracle IN 子句对性能有何影响?

oracle - dbms_utility.get_time 可以滚动吗?

java - Axon 框架与 Atomikos?工作怎么样?

Oracle:查询不可见列的注释