【问题标题】:What is the difference between bind variables and substitution variables(which I input using &&)?绑定变量和替换变量(我使用 && 输入)有什么区别?
【发布时间】:2011-12-08 15:04:58
【问题描述】:

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

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

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

此外,我还有一个困惑:以下任何陈述是否存在某种差异,它们是否都有效并且它们的意思是否相同?

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

【问题讨论】:

    标签: oracle variables plsql declaration sqlplus


    【解决方案1】:

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

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

    您可以使用SET VERIFY ONSET VERIFY OFF 启用或禁用oldnew 行的显示。您还可以使用SET DEFINE ONSET 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 并将其替换为text 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

    另一方面,绑定变量具有类型。它们不是简单的文本值。它们的值被发送到数据库,数据库也可以设置它们的值。

    SQL> 变量 bindvar varchar2(1); SQL> 执行 :bindvar := 'X'; PL/SQL 过程成功完成。

    当你想使用绑定变量时,不要在它周围加上引号:

    SQL> select * from dual where dummy = :bindvar; D - X SQL> select * from dual where dummy = ':bindvar'; 未选择任何行

    在上面的第二个示例中,我们没有返回任何行,因为 DUAL 表中没有包含 :bindvar 文本的 DUMMY 列的行。

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

    SQL> 变量绑定变量号; SQL> 执行 :bindvar := 'X'; 开始 :bindvar := 'X';结尾; * 第 1 行的错误: ORA-06502: PL/SQL: 数字或值错误: 字符到数字的转换错误 ORA-06512: 在第 1 行

    绑定变量是数据库的标准部分,您可以将它们与 JDBC 或您选择的任何连接到数据库的方法一起使用。


    最后,variable num1 numbervar num1 number 的含义相同。它们都定义了number 类型的绑定变量num1var 只是variable 的缩写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 2011-01-14
      • 2011-05-27
      • 2018-04-23
      • 1970-01-01
      • 2019-07-25
      相关资源
      最近更新 更多